2014-04-04 62 views
1

我一直在對抗這種測試方式太久,我不確定我卡在哪裏。這是我想測試模型:rspec codeschool 3級挑戰測試5

class Zombie < ActiveRecord::Base 
    attr_accessible :iq 
    validates :name, presence: true 

    def genius? 
    iq >= 3 
    end 

    def self.genius 
    where("iq >= ?", 3) 
    end 
end 

以下是我與工作啓動:

describe Zombie do 
    context "with high iq" do 
    let(:zombie) { Zombie.new(iq: 3, name: 'Anna') } 
    subject { zombie } 

    it "should be returned with genius" do 
     Zombie.genius.should include(zombie) 

    end 

    it "should have a genius count of 1" do  
     Zombie.genius.count.should == 1 
    end 
    end 
end 

這是重構的是工作的一部分:

it { should be_genius } 
#it "should have a genius count of 1" do  
# Zombie.genius.count.should == 1 
#end 

這裏是我目前堅持與重構:

describe Zombie do 
    context "with high iq" do 
    let!(:zombie) { Zombie.new(iq: 3, name: 'Anna') } 
    subject { zombie } 

     it {should include("zombie")} 
     it { should be_genius } 

    end 
end 

根據這個例子,它應該可以工作,但無論我嘗試什麼,它都會對包含進行轟炸。我知道我在這裏失去了一些蹩腳的東西。思考或提示任何人?

當前錯誤消息:

Failures: 

1) Zombie with high iq 
Failure/Error: it {should include("zombie")} 
NoMethodError: 
undefined method `include?' for #<Zombie:0x00000006792380> 
# zombie_spec.rb:7:in `block (3 levels) ' 

Finished in 0.12228 seconds 
2 examples, 1 failure 

Failed examples: 

rspec zombie_spec.rb:7 # Zombie with high iq 
+0

問問自己:「它」在你的兩個例子中代表什麼? – akatakritos

回答

3

您需要將!添加到let並將new更改爲create才能保存記錄。

describe Zombie do 
    context "with high iq" do 
    let!(:zombie) { Zombie.create(iq: 3, name: 'Anna') } 
    subject { zombie } 

    it "should be returned with genius" do 
    Zombie.genius.should include(zombie) 
    end 

    it "should have a genius count of 1" do 
    Zombie.genius.count.should == 1 
    end 

    end 
end 
+0

真棒。非常感謝你的幫助,我一直堅持幾個小時。 –

1

我不知道你指的是建議你應該重構什麼工作的例子,但在你的第一個重構示例中使用的隱含主題zombie是一個ActiveRecord實例和include您使用的匹配器旨在與https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/include-matcher中描述的字符串,數組或散列一起使用。

至於你的第二個重構的例子,我收集它的工作原理,因爲你只指出include問題。

+0

'be_genius'應該工作; RSpec爲任何以'?'結尾的謂詞匹配器構建一個謂詞匹配器,因此'be_whatever'應該在實例上調用'whatever?'。我不認爲這總是很好的風格。 – zetetic

+0

我調整了我覺得工作的是be_genius。問題仍然與包括或更確切地說測試「殭屍」包含天才......思想? –

+0

此外,我只是重新運行測試,所以我可以傾倒你的具體輸出。 –