【问题标题】:creating stub for after_create hook in rspec在 rspec 中为 after_create 钩子创建存根
【发布时间】:2013-01-01 16:23:32
【问题描述】:

我的型号代码是:

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})

可能出了什么问题?

【问题讨论】:

    标签: ruby ruby-on-rails-3 rspec rspec2 rspec-rails


    【解决方案1】:

    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

    【讨论】:

    • 你能解释一下这行吗UserGraph.should_receive(:create) { |*args| create_args = args }
    • 是的。该块是一种使用任意代码处理create 消息的方法(请参阅github.com/rspec/rspec-mocks#arbitrary-handling)。当UserGraph 收到create 消息时,它将运行提供的块。在该块中,我将create 消息提供的参数存储在一个局部变量中,以便稍后在示例结束时对其设置期望。
    【解决方案2】:

    问题是您使用 FactoryGirl 构建的 userr 没有 ID。这就是为什么期望告诉你你期望:user_id=&gt;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_including

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

    UserGraph.should_receive(:create).with(:user_id => kind_of(Numeric))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      相关资源
      最近更新 更多