Тестирование функциональных возможностей Rails Rspec: черта не зарегистрирована - PullRequest
0 голосов
/ 02 ноября 2019

rails 5.0.4 ruby 2.5.1 rspec 3.7 capybara

Мне нужна помощь по созданию заводов и их использованию в моих спецификациях. Я продолжаю сталкиваться с одними и теми же проблемами, и когда мне кажется, что я это выяснил, я снова сталкиваюсь с той же проблемой.

Модели:

customer.rb
 has many jobs

job.rb
 belongs to customer
 has_many hours

hour.rb
 belongs to job

Фабрики:

#customer.rb
FactoryGirl.define do
  factory :customer, :class => Customer do
    name "abc construction"
    contact "John"
    street "101 Main street"
    city "Anywhere"
    state "NY"
    zip "12345"
    phone "123-555-4567"
  end
end

#job.rb
FactoryGirl.define do
  factory :job, :class => Job do
    customer_id
    street "55 first str"   
    city "Anywhere"
    state "NY"
    zip "12345"  
    phone "123-456-7890"
    created_at Time.now
    updated_at Time.now
    description  "Test Job"
    name "house repairs"    
  end
end

# hour.rb
FactoryGirl.define do
  factory :hour, :class => Hour do
    job_id
    date_worked Date.today  
    hours 1
    description "test"   
  end
end

Спецификация функции часов

# hours_spec.rb
context "edit form" do
    before(:each) do
      customer=FactoryGirl.create(:customer)
      job=FactoryGirl.create(:job, :customer_id => customer.id)
      hours=FactoryGirl.create(:hour, :job_id => job.id)

      visit edit_hour_path(:id => hours.id)
    end
    scenario "update messages shows" do
      within('form') do
        fill_in 'hour_description', with: 'testing'
      end
      click_button("Update Hours")
      expect(page).to have_content("You updated the record")
    end
  end

Запуск тестов спецификации часов

rspec spec/features/hours_spec.rb
...
.....Capybara starting Puma...
* Version 3.9.1 , codename: Private Caller
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:44465
.DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver
.F

Failures:

  1) Hours edit form update messages shows
     Failure/Error: job=FactoryGirl.create(:job, :customer_id => customer.id)

     ArgumentError:
       Trait not registered: customer_id
     # ./spec/features/hours_spec.rb:58:in `block (3 levels) in <top (required)>'

Finished in 0.86646 seconds (files took 1.24 seconds to load)
8 examples, 1 failure

Если я изменю фабрику заданий на значение customer_id, я получаю похожую ошибку, но счисло (488). возможно, что он видит как customer_id?

FactoryGirl.define do
  factory :job, :class => Job do
    customer_id FactoryGirl.create(:customer)
    ...
end
rspec spec/features/hours_spec.rb

Failures:

  1) Hours edit form update messages shows
     Failure/Error: job=FactoryGirl.create(:job, :customer_id => customer.id)

     ArgumentError:
       Trait not registered: 488
     # ./spec/features/hours_spec.rb:58:in `block (3 levels) in <top (required)>'

Что я делаю не так? Как правильно это сделать?

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

FactoryGirl недавно была переименована в FactoryBot и удалила поддержку назначения статических значений свойствам из-за проблем, связанных с датами (все даты / время на ваших фабриках всегда будут назначаться как время / дата, когда код читается, а не когдаон был фактически запущен. Вы должны обновить, а также использовать ассоциации на своих фабриках вместо прямого назначения идентификаторов.


#customer.rb
FactoryBot.define do
  factory :customer, :class => Customer do
    name { "abc construction" }
    contact { "John" }
    street { "101 Main street" }
    city { "Anywhere" }
    state { "NY" }
    zip { "12345" }
    phone { "123-555-4567" }
  end
end

#job.rb
FactoryBot.define do
  factory :job do # class defaults to one matching the factory name
    customer # association type defaults to one matching the name
    street { "55 first str" }   
    city { "Anywhere" }
    state { "NY" }
    zip { "12345" }  
    phone { "123-456-7890" }
    # created_at and updated_at are handled automatically 
    # created_at { Time.now }
    # updated_at { Time.now }
    description  { "Test Job" }
    name { "house repairs" }    
  end
end

job = FactoryBot.create (: job) # это автоматически создаст ассоциированного клиента

job = FactoryBot.creatE (: job, customer: FactoryBot.create (: customer, name: 'abc')) # # будет использовать клиента, переданного в качестве ассоциированного клиента

0 голосов
/ 02 ноября 2019

Вам необходимо передать хэш фабричным методам, а не присваивать локальные переменные

job=FactoryGirl.create(:job, customer_id: customer.id) 

, хотя, поскольку у вас есть ассоциативная принадлежность между заданием и клиентом, вы должны искать ассоциации в factory_girl (теперь она называется фабричным ботом). ) и иметь customer на вашем заводе, а не customer_id https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations

...