Подтвердить что ты не робот

Проверка ассоциаций ActiveRecord в RSpec

Я изучаю, как писать тестовые примеры с помощью Rspec. У меня есть простая публикация комментариев, которые могут содержать много комментариев. Я тестирую это с помощью Rspec. Как мне перейти на проверку Post :has_many :comments. Должен ли я закодировать метод Post.comments, а затем проверить это, возвращая макет объекта массива объектов комментариев? Действительно ли требуется тестирование для ассоциаций AR?

4b9b3361

Ответ 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

или что-то похожее на это.