在Rspec3中使用expect_any_instance_of

时间:2014-03-21 07:32:15

标签: ruby-on-rails rspec expectations rspec3

这里有文件:https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/message-expectations/expect-a-message-on-any-instance-of-a-class

我想知道它的正确使用方法。

我有一个控制器

class UserController < ApplicationController
  def edit
    generate_token!
  end
end

方法generate_token!在模型中定义。

class User < ActiveRecord::Base
  def generate_token!
    self.update!(token: 'something')
  end
end

我只想检查方法是否收到了什么。 规范就像是。

describe 'edit'
  it 'receives something' do
    expect_any_instance_of(Object).to receive(:generate_token!)
  end
end

但是我必须为Object使用什么?我尝试了这个课程以及其他一些随机的东西,但还没有任何工作。好像我根本得不到模拟。 有什么建议吗?

最好的问候 denym_

1 个答案:

答案 0 :(得分:0)

您需要在规范中将Object替换为Client。该方法的名称也只是&#34; generate_token&#34;不是&#34; generate_token!&#34;就像你现在的规范一样。

看来你正在混合generate_token!在您的控制器和客户端模型中的generate_token方法。

在编辑操作中,您正在调用generate_token!在同一个类(控制器)中定义(我假设你只在这里粘贴了编辑动作,所以你可能在控制器中真的有这个方法)。 无论如何,如果你没有generate_token!控制器中的方法,其行如下:

@client.generate_token

您的客户端模型中的generate_token永远不会从您的控制器中调用。

还有一件事:处理客户端记录的控制器的名称真的叫做users_controller?

如果您确实拥有单独的用户和客户端模型,那么这也可能会导致问题。

我想现在我知道你的主要困惑是什么。

期待只设定你的期望。您仍然需要创建类的实例并触发您希望发生的事情发生的操作。

EG。如果您正在测试控制器操作,则需要在设置期望后调用编辑操作。

client = create(:client)
get :edit, id: client