Есть удобные shoulda
сопоставители драгоценных камней для тестирования accepts_nested_attributes_for
, но вы упомянули, что не хотите использовать другие драгоценные камни. Итак, используя только Rspec, идея состоит в том, чтобы установить attributes
хеш, который будет включать обязательные атрибуты Tester
и вложенный хеш, называемый skill_attributes
, который будет включать обязательные атрибуты Skill
; затем передайте его в create
метод Tester
и посмотрите, не изменит ли он число Testers
и число Skills
. Примерно так:
class Tester < Person
has_one :company
accepts_nested_attributes_for :skill
# lets say tester only has name required;
# don't forget to add :skill to attr_accessible
attr_accessible :name, :skill
.......................
end
Ваши тесты:
# spec/models/tester_spec.rb
......
describe "creating Tester with valid attributes and nested Skill attributes" do
before(:each) do
# let's say skill has languages and experience attributes required
# you can also get attributes differently, e.g. factory
@attrs = {name: "Tester Testov", skill_attributes: {languages: "Ruby, Python", experience: "3 years"}}
end
it "should change the number of Testers by 1" do
lambda do
Tester.create(@attrs)
end.should change(Tester, :count).by(1)
end
it "should change the number of Skills by 1" do
lambda do
Tester.create(@attrs)
end.should change(Skills, :count).by(1)
end
end
Синтаксис хэша может отличаться. Кроме того, если у вас есть какие-либо проверки уникальности, убедитесь, что вы генерируете хеш @attrs
динамически перед каждым тестом.
Ура, приятель.