0

嗨,我正在通过 Hartl 工作。我已经到了第 10 章的微博部分,但我生成了 9 次失败,我不明白!

Failures:

  1) Hotel 
     Failure/Error: it {should be_valid}
       expected valid? to return true, got false
     # ./spec/models/hotel_spec.rb:19:in `block (2 levels) in <top (required)>'

  2) Hotel user 
     Failure/Error: its(:user) { should == user }
       expected: #<User id: 211, name: "Person 80", email: "person_78@example.com", created_at: "2013-04-26 22:09:22", updated_at: "2013-04-26 22:09:22", password_digest: "$2a$04$ofUpcvsd84qDWTXG131PYedxXdTy2nPzTME/Gf5rc8c0...", remember_token: "wsF59SbMlKni1mqKLhFX0A", admin: false>
            got: nil (using ==)
     # ./spec/models/hotel_spec.rb:17:in `block (2 levels) in <top (required)>'

这是我的 hotel_spec.rb 文件

require 'spec_helper'

describe Hotel do
  let(:user) {FactoryGirl.create(:user)}
  before {@hotel = user.hotels.build(title: "Hilton", room_description: "Biiiiig Room",include_breakfast: "false", price: 566.6, adress:"Smolnaya")}

    subject(@hotel)

    it {should respond_to(:title)}
    it {should respond_to(:room_description)}
    it {should respond_to(:include_breakfast)}
    it {should respond_to(:price)}
    it {should respond_to(:adress)}
    it {should respond_to(:user_id)}
    it {should respond_to(:user)}

    its(:user) { should == user }

    it {should be_valid}

    describe "accesible attributes" do
      it "should not allow access to user_id" do
        expect do
          Hotel.new(user_id: user.id)
        end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
      end
    end

    describe "when user_id is not present" do
      before {@hotel.user_id = nil}
      it {should_not be_valid}
    end

end

我的hotel.rb 文件

class Hotel < ActiveRecord::Base
  attr_accessible :adress, :include_breakfast, :price, :room_description, :title
  belongs_to :user

  validates :user_id, presence: true
end

我在哪里犯了错误?非常感谢任何想法和解决方案。谢谢。

4

2 回答 2

2
subject { @hotel }

Braces, not parentheses.
subject expects a code block (i.e. similar to do ... end), not arguments.

A little off-topic, but it may be helpful to follow the convention of including white space within the braces.

于 2013-04-27T01:34:42.933 回答
1

@Sunxperous 的答案似乎是正确的——我建议您使用thoughtbot 应该宝石来使您的测试更加简单。还可以使用 FactoryGirl 创建您的酒店模型。使用宝石,您的 rspec 可能看起来像

require 'spec_helper'

describe Hotel do

  let(:user) { FactoryGirl.create :user }
  subject(:hotel) { FactoryGirl.create :hotel, user: user }

  it { should be_valid } # a valid factory is very important

  it { should_not allow_mass_assignment_of :user_id }
  it { should validates_presence_of :user }
  it { should belong_to :user }

  it {should respond_to(:title)}
  it {should respond_to(:room_description)}
  it {should respond_to(:include_breakfast)}
  it {should respond_to(:price)}
  it {should respond_to(:adress)}
  it {should respond_to(:user_id)}
  it {should respond_to(:user)}

end
于 2013-04-27T04:56:19.417 回答