2016-09-21 10 views
0

私はルビーとレールで仕様書を書くことを学んでいます。だから私は似ている2つの同様のモデルを持っています:質問と答え。だから私はコードを複製せず、この2つの例を共有するようにしています。共有サンプルの設定方法は?

RSpec.shared_examples_for 'User Votable' do 

    let!(:user){ create :user } 
    let!(:sample_user){ create :user } 
    let!(:vote){ create :vote, user: user, votable: votable, vote_field: 1} 

    it 'user different from resource user is accapteble' do   
    expect(votable.user_voted?(sample_user)).to be_falsy 
    end 

    it 'user similar to resource user is accapteble' do 

    expect(votable.user_voted?(user)).to be_truthy 
    end 

end 

とテスト自体

describe 'user_voted?' do 
    def votable 
    subject{ build(:question)} 
    end 
    it_behaves_like 'User Votable' 
end 

それは、このスペックで失敗した最後の(私が原因で対象を考える - 私は投票を作成するとき、それは変更されません) だから私はあれば非常に幸せになります私はそれを正しく行う方法を管理し、理解することができました。私はこのようなモックを使用しようとすると、任意のアドバイス

のために非常に感謝しても、それはuser_voted主キー

allow(:question){create :question} 

Failures: 

1)質問を持っていないの文句? (?votable.user_voted(ユーザー)):ユーザーがリソースへの同様のユーザーVotableユーザーがaccapteble 失敗/エラーであるように振る舞う。期待する代わりにvotableメソッドを持つの

expected: truthy value 
     got: false 
Shared Example Group: "User Votable" called from ./spec/models/question_spec.rb:23 
+0

ただ、 'defのvotableを行います。ビルド(:question);最後に –

+0

def votable build(:question)end私は同様のエラーを受け取っています(更新済み) –

答えて

1

をbe_truthyするために、あなたのようなsubjectを設定できます。

it_behaves_like 'User Votable' do 
    subject { build(:question) } 
end 
+0

そして、私の仕様でこのテーマにどのように対処すればよいですか? –

1

あなたが実際にsubjectを使用する必要はありません、あなたはちょうどあなたがletを使って好きなコンテキストを設定することができますし、それはブロック内で利用できるようになります:

describe 'user_voted?' do 
    let(:votable) { build(:question) } 
    it_behaves_like 'User Votable' 
end 

次に、あなただけの共有例内votableを参照することができますし、それは文脈によって定義されます:

RSpec.shared_examples_for 'User Votable' do 
    let!(:user) { create :user } 
    let!(:sample_user) { create :user } 
    let!(:vote) { create :vote, user: user, votable: votable, vote_field: 1 } 

    it 'user different from resource user is acceptable' do   
    expect(votable.user_voted?(sample_user)).to be_falsy 
    end 

    it 'user similar to resource user is acceptable' do 
    expect(votable.user_voted?(user)).to be_truthy 
    end 
end 

あなたはまた、偶然により柔軟にit_behaves_likeブロックにパラメータを渡すことができます。

参考:Providing context to a shared group using a block

(注:上記のいくつかの綴りの誤字を修正)

関連する問題