Проверка ассоциаций ActiveRecord в RSpec - PullRequest
17 голосов
/ 20 апреля 2010

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

Ответы [ 4 ]

28 голосов
/ 20 апреля 2010

Поскольку ассоциации ActiveRecord должны быть хорошо протестированы набором тестов Rails (и они есть), большинству людей не нужно проверять, работают ли они - просто предполагается, что они будут.

Если вы хотите убедиться, что ваша модель использует эти ассоциации, это что-то другое, и вы не ошибаетесь, если хотите проверить это. Мне нравится делать это, используя камень shoulda . Это позволяет вам делать аккуратные вещи, как это:

describe Post do
  it { should have_many(:comments).dependent(:destroy) }
end
12 голосов
/ 09 февраля 2013

Тестирование ассоциаций является хорошей практикой в ​​целом, особенно в среде, где TDD высоко ценится - другие разработчики часто обращаются к вашим спецификациям, прежде чем посмотреть соответствующий код. Ассоциация тестирования гарантирует, что ваш спецификационный файл наиболее точно отражает ваш код.

Два способа проверки ассоциаций:

  1. С FactoryGirl:

    expect { FactoryGirl.create(:post).comments }.to_not raise_error
    

    Это сравнительно поверхностный тест с фабрикой вроде:

    factory :post do
      title { "Top 10 Reasons why Antelope are Nosy Creatures" }
    end
    

    вернет вам NoMethodError, если в вашей модели отсутствует has_many связь с комментариями.

  2. Вы можете использовать метод ActiveRecord # refle_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
    

    и тестируйте все возможные варианты или условия.

1 голос
/ 18 сентября 2014

Если вы не хотите использовать внешний драгоценный камень, такой как musta , для проверки ваших ассоциаций (см. 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
0 голосов
/ 20 апреля 2010

Большинство людей не проверяют ассоциации, поскольку в Rails уже есть модульные тесты, чтобы убедиться, что эти методы работают правильно. Если вы делаете что-то сложное, например, задействуете процесс или что-то еще, вы можете явно протестировать это. Обычно вы можете сделать это, просто набрав

a = Post.new
a.comments << Comment.new
assert a.save
assert a.comments.size == 1

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

...