2016-07-15 6 views
0

ユーザーモデルのクラスメソッド#registered_but_not_logged_in(email)をテストしようとしていますが、これはconfirmed_atというエントリを持つ電子メールにマッチする最初のユーザーですが、私はsign_in_countと数える)。私はFactorygirlとrspecを使用しています。さらに、shoulda-matchers v2.8を使用しています。ここでrspecでモデルインスタンスを返すクラスメソッドをテストする方法

はRubyの:

def self.registered_but_not_logged_in email 
    self.with_email(email).confirmed.never_signed_in.first 
end 

私はRailsのコンソールでこれをテストしてみたし、それがその端にロジックの問題ではないですので、私は期待どおりに動作します知っているので、私は私がやっていると思っています私のテストで何かが間違っています:

describe User do 
    # create @user 

    describe ".registered_but_not_logged_in" do 
    it "returns a user that matches the provided email who is confirmed, but who has not yet signed in" do 
     @user.confirmed_at = 2.days.ago 
     @user.email = "[email protected]" 

     result = described_class.registered_but_not_logged_in("[email protected]") 
     expect(result).to be_instance_of(User) 
    end 
    end 

この例では、resultはnilです。私はこれが@userデータベースの外部に存在することを知っていますが、メソッドはDBを積極的にチェックしていますが、rspec/factorygirlを使用してこれを処理する方法はわかりません。どんな助けでも間違いなく感謝しています!

+2

変更を永続化するためにおそらく '@ user.save'が必要です - 実装はデータベースに行き、メモリ内の変更をスキップします – nort

+0

@nort' @ user.save'を追加しても、残念なことに変更はありません。 'result'はまだゼロです。 – octopushugs

答えて

0

だから私が働いている理由私がやっている100%わからないんだけど、ここで私は@nortと私の同僚の1の助けを借りて偶然見つけ解決策だ:

it "returns a user that matches the provided email who is confirmed, but who has not yet signed in" do 
    @user.confirmed_at = 2.days.ago 
    @user.email = "[email protected]" 
    @user.sign_in_count = 0 
    @user.save! 
    expect(User.registered_but_not_logged("[email protected]")).to be_instance_of(User) 
end 

何Iセーブが起こっていると信じている! @userをテストデータベースに保存していますが、それ以外の場合は別のDBに対して開発しています。もちろん、存在しないデータはテストできないという問題があります。

なお、expect()。to ...はrpsecの優先規則です。また、described_class私は完全にうまくいくと思っていますが、私はまだこのことを学んでいるので、今すぐexplicitnessを好むです。

関連する問題