Тестирование ассоциаций с rspec-rails 3.0.1 и shoulda не работает


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

# 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. вы можете проверить объединений Без бы камень? Это кажется невозможным, основываясь на том, что я видел с синтаксисом "expect".
  2. должен ли драгоценный камень порвать с rspec 3.0.1 для всех? Есть ли обходной путь?
3 4

3 ответа:

Shoulda-matchers-это драгоценный камень, который обеспечивает ассоциацию, проверку и другие сопоставления.

Драгоценный камень shoulda (который мы также делаем) предназначен для использования shoulda-matchers с Test::Unit (а также предоставляет некоторые приятные вещи, такие как контексты и возможность использовать строки в качестве имен тестов). Но если вы на Вас, Вы будете хотеть использовать надо-вычислителей, не стоило.

Вот как это работает, теперь с драгоценным камнем shoulda-matchers и синтаксисом "expect"

describe User, type: :model do
  it { is_expected.to belong_to :school }
end

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

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

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

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

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

Или

expect(@user).to belong_to @school