Mocha: 如何为实例方法设置期望?

6
假设这段 Ruby 代码:
class User
  def self.failed_login!(email)
    user = User.find_by_email(email)
    if user
      user.failed_login_count = user.failed_login_count + 1
      user.save
    end
  end
end

我想编写一个测试,以测试当给出无效电子邮件时,永远不会调用user.save。例如:

it "should not increment failed login count" do
   User.expects(:save).never()
   User.failed_login!("doesnotexist")
end

这个测试目前通过了,但只要我提供一个有效的电子邮件地址,它也会通过。

我该如何使用Mocha(或任何其他模拟框架)设置期望,使其测试任何User实例的save方法都不会被调用?

最好不要存根/模拟find_by_email方法,因为将来获取用户的实现可能会更改。

谢谢

2个回答

22

对于其他可能遇到这个问题的人,我在另一篇帖子中找到了答案,那篇帖子是与 RR 作为模拟框架有关的... 在 Mocha 中,你可以这样做:

User.any_instance.expects(:save).never()

1
只需注意在运行此代码时与 RSpec 模拟一起使用,因为它会影响所有后续实例。根据规范,Mocha 可以成功地取消模拟。 - avocade

4

或者你可以这样做

user = mock
User.expects(:find).returns user
user.expects(:save).never

5
在这种情况下,User.expects(:find) 可能最好改为 User.stubs(:find),因为我们并不真正关心是否调用了 User.find - 只是不希望调用 User#save。 - James Mead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接