0

这里是文档: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

但是我必须为对象使用什么?我尝试了课程和其他一些随机的东西,但还没有奏效。看来我根本没有得到模拟。有什么建议么?

最好的问候否认_

4

1 回答 1

0

您需要在规范中将 Object 替换为 Client。此外,该方法的名称只是“generate_token”而不是“generate_token!” 正如您目前在规范中所拥有的那样。

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

在编辑操作中,您正在调用 generate_token!在同一个类(控制器)中定义(我假设您只在此处粘贴了编辑操作,因此您的控制器中可能确实有此方法)。无论如何,如果您没有 generate_token!控制器中的方法有这样的一行:

@client.generate_token

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

还有一件事:处理您的客户记录的控制器的名称真的称为 users_controller 吗?

如果你真的有一个单独的用户和客户端模型,那也可能会导致问题。

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

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

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

client = create(:client)
get :edit, id: client
于 2014-03-21T07:55:54.797 回答