Я изучаю, как писать тестовые примеры с помощью Rspec. У меня есть простая публикация комментариев, которые могут содержать много комментариев. Я тестирую это с помощью Rspec. Как мне перейти на проверку Post :has_many :comments
. Должен ли я закодировать метод Post.comments
, а затем проверить это, возвращая макет объекта массива объектов комментариев? Действительно ли требуется тестирование для ассоциаций AR?
Проверка ассоциаций ActiveRecord в RSpec
Ответ 1
Поскольку ассоциации ActiveRecord должны быть хорошо протестированы набором тестов Rails (и они есть), большинство людей не чувствует необходимости убедиться, что они работают - они просто предполагают, что они будут.
Если вы хотите убедиться, что ваша модель использует эти ассоциации, это нечто иное, и вы не ошибаетесь в том, что хотите проверить это. Мне нравится делать это с помощью shoulda gem. Он позволяет вам делать такие простые вещи:
describe Post do
it { should have_many(:comments).dependent(:destroy) }
end
Ответ 2
Тестирование ассоциаций - хорошая практика, особенно в среде, где TDD очень ценится. Другие разработчики часто будут смотреть на ваши спецификации, прежде чем смотреть на соответствующий код. Тестирование ассоциаций гарантирует, что ваш файл спецификации наиболее точно отражает ваш код.
Два способа тестирования ассоциаций:
-
С FactoryGirl:
expect { FactoryGirl.create(:post).comments }.to_not raise_error
Это относительно поверхностный тест, который будет с factory следующим:
factory :post do title { "Top 10 Reasons why Antelope are Nosy Creatures" } end
возвращает вам NoMethodError, если в вашей модели отсутствует ассоциация
has_many
с комментариями. -
Вы можете использовать метод ActiveRecord # reflect_on_association, чтобы более подробно изучить вашу связь. Например, с более сложной ассоциацией:
class Post has_many :comments, through: :user_comments, source: :commentary end
Вы можете более глубоко изучить вашу ассоциацию:
reflection = Post.reflect_on_association(:comment) reflection.macro.should eq :has_many reflection.options[:through].should eq :user_comments reflection.options[:source].should eq :commentary
и проверить, какие параметры или условия релевантны.
Ответ 3
Если вы не хотите использовать внешний камень, например shoulda, чтобы проверить свои ассоциации (см. Robert Speicher Ответ), другой вариант - использовать reflect_on_association
, чтобы получить объект AssociationReflection
для соответствующей ассоциации, а затем утвердить следующее:
describe Post do
it "should destroy its comments when it is destroyed" do
association = Post.reflect_on_association(:comments)
expect(association).to_not be_nil
expect(association.options[:dependent]).to eq :destroy
end
end
Ответ 4
Большинство людей не тестируют ассоциации, так как Rails уже имеет модульные тесты, чтобы убедиться, что эти методы работают правильно. Если вы делаете что-то сложное, например, вовлечение в процесс или что-то еще, вы можете явно протестировать его. Обычно вы можете сделать это, просто сделав
a = Post.new
a.comments << Comment.new
assert a.save
assert a.comments.size == 1
или что-то похожее на это.