如何编写使用 with 发送参数的模拟方法

问题描述

嗨,我想知道如何为以下内容编写 rspec

def find_user(content)
  user = User.find(content.to_i) || 
  User.find(email: content) rescue 
 nil
end

我试着写

It "user with user name" do
  expect(User).to receive(:find).with(email: "[email protected]").and_return(user)
End

但我说得有点错误

Argument Error
Block not Passed

谁能告诉我我错过了什么

解决方法

我可能会先在这里查看您的代码。

def find_user(content)
  user = User.find(content.to_i) || 
  User.find(email: content) rescue 
 nil
end

什么是内容?看来您需要的是 user_id 或电子邮件地址。

从控制台执行此操作:

irb(main):080:0> User.find("[email protected]".to_i)
=> ActiveRecord::RecordNotFound (Couldn't find User with 'id'=0)

因此,似乎拥有一个通用的 find_user 方法可能会导致一些测试编写混乱。

很多时候,过于复杂的测试指向过于复杂的代码。

也许你需要一种方法

find_user_by_email(email)

和另一个 find_user_by_id(id)

另请参阅https://api.rubyonrails.org/v6.1.3.2/classes/ActiveRecord/FinderMethods.html#method-i-find_by

如果没有找到,它会自动返回 nil

从那里开始,然后像其他评论者一样,然后发布您的课程和规范,我们可以从那里开始。