преминаване от тела към Factory Girl

Rails 3.0.3....

Току-що започвам с Factory Girl, след като имах малък успех със стандартния подход. Коментирах fixtures :all от файла test/test_helper.rb и създадох файл с фабрики.

Проблемът ми е, че функцията за последователност изглежда не работи:

# test/factories.rb
Factory.sequence :clearer_name do |n|
   "Clearer_#{n}"
end

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

Моят (функционален) тест е само малко по-различен от стандартния:

require 'test_helper'

class ClearersControllerTest < ActionController::TestCase
   setup do
      @clearer = Factory.create(:clearer)
   end

test "should get index" do
   get :index
   assert_response :success
   assert_not_nil assigns(:clearers)
 end

 test "should get new" do
   get :new
   assert_response :success
 end

 test "should create clearer" do
   assert_difference('Clearer.count') do
     post :create, :clearer => @clearer.attributes
   end

   assert_redirected_to clearer_path(assigns(:clearer))
 end

Когато стартирам rake test получавам:

test_should_create_clearer(ClearersControllerTest):
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: column name is not unique: INSERT INTO "clearers" ("active", "updated_at", "name", "created_at") VALUES ('t', '2011-02-20 08:53:37.040200', 'Clearer_1', '2011-02-20 08:53:37.040200')

...като че ли не продължава последователността.

Някакви съвети?

Благодаря,

АКТУАЛИЗАЦИЯ: ето моя тестов файл:

#clearers_controller_test.rb
require 'test_helper'
class ClearersControllerTest < ActionController::TestCase
  setup do
    @clearer = Factory.create(:clearer)
  end

  test "should create clearer" do

    assert_difference('Clearer.count') do
      # does not work without this:
      Clearer.destroy_all 
      post :create, :clearer => @clearer.attributes
    end
end

Мога да накарам това да работи, като поставя Clearer.destroy_all в горната част на тестовия метод, както е показано, но това не ми се струва правилно.


person Robert Brown    schedule 20.02.2011    source източник
comment
Малко несвързано, но Rails 3.0.4 е излязъл и включва важни поправки за сигурност, така че бих препоръчал актуализиране.   -  person Andrew Marshall    schedule 20.02.2011
comment
Мисля, че виждам проблема сега, след като добавихте тестовия случай.   -  person jemminger    schedule 21.02.2011


Отговори (3)


Виждам - ​​във вашата настройка вие създавате Clearer екземпляр. Методът Factory.create изгражда и записва нов запис и го връща.

Проблемът е, че след това се опитвате да създадете друг екземпляр във вашия тест „трябва да създаде по-ясно“, но използвате повторно атрибутите на съществуващия екземпляр.

Ако искате Factory да върне нови атрибути (и следващата последователност от имена), трябва да поискате нови атрибути:

test "should create clearer" do
  assert_difference('Clearer.count') do
    post :create, :clearer => Factory.attributes_for(:clearer)
  end
end

Трябва да използвате този съществуващ @clearer екземпляр само в контекста на съществуващ запис, а не там, където искате нов.

person jemminger    schedule 21.02.2011

Предполагам, че не започвате с нова база данни. Има много причини това да се случи, но можете да проверите, че това е проблемът, като добавите Clearer.destroy_all във вашата функция за настройка, преди да създадете такъв.

person ctide    schedule 20.02.2011

Последователностите и другите стойности на атрибути, които се изчисляват по време на изпълнение, трябва да бъдат процедури, а не статични стойности.

промяна:

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

to:

Factory.define :clearer do |f|
   f.name {Factory.next(:clearer_name)}
end
person jemminger    schedule 20.02.2011