2

私のモデルコードは次のとおりです。

class User < ActiveRecord::Base
  after_create :create_node_for_user

   def create_node_for_user
     UserGraph.create(user_id: self.id)
   end
end

ユーザーモデルのテスト:

it "create node in graph database on user creation" do
  userr = FactoryGirl.build(:user)
  UserGraph.should_receive(:create).with(user_id: userr.id)
  userr.save
end

しかし、私のテストはメッセージで失敗しています

Failure/Error: userr.save
   <UserGraph (class)> received :create with unexpected arguments
     expected: ({:user_id=>nil})
          got: ({:user_id=>94})

何が悪いのでしょうか?

4

2 に答える 2

3

Yves の説明は正しいです。DB によって自動生成されるため、レコードが保存されるまでユーザー ID は nil です。別のアプローチを次に示します。

it "create node in graph database on user creation" do
  userr = FactoryGirl.build(:user)

  create_args = nil
  UserGraph.should_receive(:create) { |*args| create_args = args }
  userr.save

  expect(create_args).to eq(:user_id => userr.id)
end

基本的に、これは引数がどうあるべきかについての期待を動かし、レコードが保存されたidに来るようにします。

于 2013-01-01T20:00:26.467 に答える
2

問題は、userrFactoryGirl でビルドしたものが ID を持っていないことです。それが、期待があなたが期待したことを伝える理由です:user_id=>nil。ID は AR がレコードを保存するときに生成されるため、生成された ID を事前に推測することはできません。モックで制限の少ないアサーションを使用できます。

UserGraph.should_receive(:create).with(hash_including(:user_id))

これにより、ハッシュがキーとともに渡されることが検証され:user_idます。ここで詳細を見つけることができますhash_including: http://rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers:hash_include

あなたが試すことができるもう1つのこと(うまくいくかどうかはわかりません)はkind_of、rspecのマッチャーと照合することです。これにより、数値が渡されたことを確認できます:user_id

UserGraph.should_receive(:create).with(:user_id => kind_of(Numeric))
于 2013-01-01T16:42:13.920 に答える