Тестирование ассоциаций с rspec-rails 3.0.1 и должно не работать

В настоящее время с rspec-rails (2.14.2) я проверяю свои ассоциации в спецификациях модели с помощью драгоценного камня shoulda (3.5.0) следующим образом:

# app/models/user.rb
class User < ActiveRecord::Base

  belongs_to :school

end

# spec/models/user_spec.rb
describe User do

  it { should belong_to :school }

end

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

Сообщение об ошибке:

1) User
     Failure/Error: it { is_expected.to belong_to :school }
     NoMethodError:
       undefined method `belong_to' for #<RSpec::ExampleGroups::School:0x007f8a4c7a68d0>
     # ./spec/models/user.rb:4:in `block (2 levels) in <top (required)>'

Итак, мои вопросы:

  1. Можете ли вы проверить ассоциации без драгоценного камня? Это кажется невозможным, исходя из того, что я видел с синтаксисом «ожидания».
  2. Не работает ли гем shoulda с rspec 3.0.1 для всех? Есть ли обходной путь?

person Randy Burgess    schedule 04.06.2014    source источник
comment
Вы включили gem 'shoulda-matchers' в Gemfile?   -  person zishe    schedule 04.06.2014
comment
У меня есть драгоценный камень shoulda, но не must-matchers. Вот так у меня было настроено раньше.   -  person Randy Burgess    schedule 04.06.2014
comment
Я думаю, вы должны сделать это вот так   -  person zishe    schedule 04.06.2014
comment
Я думаю, ваша ассоциация должна быть belongs_to :school (школа уникальна). Возможно, это источник проблемы   -  person gotva    schedule 04.06.2014
comment
Это ошибка, но похоже ошибка не в этом.   -  person zishe    schedule 04.06.2014
comment
@govta - это была просто синтаксическая ошибка, когда я переместил пример. Это правильно в приложении, и я исправил это здесь.   -  person Randy Burgess    schedule 04.06.2014
comment
Затем, пожалуйста, опубликуйте текущее сообщение об ошибке. Тот, который вы разместили, уже устарел, и я, вероятно, удалю его. Делает для запутанного чтения прямо сейчас.   -  person Michael Durrant    schedule 04.06.2014
comment
Сообщение об ошибке такое же, как и раньше. Я просто сделал синтаксическую ошибку в примере. Извините, что смущаю вас.   -  person Randy Burgess    schedule 04.06.2014


Ответы (3)


shoulda-matchers — это жемчужина, которая обеспечивает сопоставление, проверку и другие сопоставления.

Гем shoulda (который мы также делаем) предназначен для использования совпадений shoulda с Test::Unit (а также предоставляет некоторые приятные вещи, такие как контексты и возможность использовать строки в качестве имен тестов). Но если вы работаете с RSpec, вам следует использовать «должны-сопоставители», а не «должны».

person Elliot Winkler    schedule 04.06.2014

Вот как это работает, теперь с жемчугом shoulda-matchers и синтаксисом «ожидания»

describe User, type: :model do
  it { is_expected.to belong_to :school }
end
person Randy Burgess    schedule 05.06.2014

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

У вас могут возникнуть проблемы, если вы на самом деле не назначили своего пользователя в свою школу. Вам нужно заполнить внешний ключ, а не просто использовать отношения, не сделав этого.

Так что вам может понадобиться сделать

@school = School.new
@user = User.new
@school.users << @user

it { should belong_to :school } # within the user block

or

expect(@user).to belong_to @school
person Michael Durrant    schedule 04.06.2014
comment
Сопоставители должны проверять ассоциации по мере их назначения в модели. Это отлично работает с rails-rspec 2.x. Таким образом, мой вопрос заключается в том, могу ли я выполнить тот же тест с синтаксисом ожидания. - person Randy Burgess; 04.06.2014
comment
Я согласен, зачем вводить еще 3 строки rspec, чтобы убедиться, что вы поместили 1 (например, own_to) в код, который вы тестируете? - person Katarzyna; 15.05.2015