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 给出的解释是正确的:用户 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

问题是userr您使用 FactoryGirl 构建的没有 ID。这就是为什么期望告诉你你期望:user_id=>nil。ID 会在 AR 保存记录时生成,所以无法提前猜出生成的 ID。您可以在模拟上使用限制较少的断言:

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

这将验证散列是否通过:user_id密钥传递。你可以在这里找到更多信息hash_includinghttp ://rubydoc.info/gems/rspec-mocks/RSpec/Mocks/ArgumentMatchers:hash_include

您可以尝试的另一件事(不确定它是否有效)是kind_of匹配 rspec 的匹配器。这将确保一个数字通过:user_id

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