【问题标题】:How to mock a service object? should I mock it?如何模拟服务对象?我应该嘲笑它吗?
【发布时间】:2014-05-27 02:01:21
【问题描述】:

我有一个名为 ResetPassword 的服务对象,它处理 ResetPassword 控制器创建操作的所有逻辑。我也已经测试过服务对象。我应该模拟服务对象吗?我想我应该这样做,因为它已经过测试,并且会减少运行规格。到目前为止,我对控制器的测试代码如下。不知道是不是应该这样写。

require 'spec_helper'

describe ResetPasswordController do
  describe "POST create" do
    context "when email matches a user" do
      let(:user) { Fabricate(:user) }

      it "calls password_reset on PasswordReset" do
        ResetPassword.stub(:reset_password)
        ResetPassword.any_instance.should_receive(:reset_password)
        post :create, email: user.email

      end
      it "redirects to root path" do
        post :create, email: user.email
        expect(response).to redirect_to root_path
      end
    end
    context "when email doesn't match a user" do
      it "redirects to new"
      it "displays a flash error"
    end
  end
end

【问题讨论】:

  • 你的控制器代码是什么?

标签: ruby-on-rails ruby rspec mocking stubs


【解决方案1】:

我认为您应该在控制器中模拟服务,但通过注入模拟而不是在类上存根来模拟它或any_instance

您的控制器可能如下所示

class ResetPasswordController < ApplicationController
  def create
    reset_password_service.reset_password(params[:email])
  end

  def reset_password_service
    @reset_password_service ||= ResetPassword.new
  end

  def reset_password_service=(val)
    @reset_password_service = val
  end
end

然后在你的规范中你可以

before { controller.reset_password_service = password_service }
let(:password_service) { double("PasswordService", reset_password: nil) }

it "does something good" do
  post :create, email: "foo"
  expect(password_service).to have_received(:reset_password).with("foo")
end

或者更好的是,改用instance_double。这还将检查存根方法是否实际存在于存根类中。这可从 RSpec 3.0.0.beta* 获得

let(:password_service) { instance_double(PasswordService, reset_password: nil) }

【讨论】:

    【解决方案2】:

    您可以使用 mockito 模拟您的服务,并使用 mockito 模拟多个服务。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 您的回答实际上并没有解决问题,即他们是否应该嘲笑。要回答这样的问题,您需要做的不仅仅是指出几个模拟选项,而是说明它如何以及为什么可能有助于(或无助于)他们的情况。另外,请注意原始问题已超过 7 年,因此 OP 可能已经继续!在这个阶段的任何答案确实需要为现在遇到问题的人提供大量更新或上下文。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2013-02-16
    • 2012-07-26
    • 2010-09-07
    • 2015-12-18
    • 1970-01-01
    • 2020-05-16
    • 2020-08-20
    相关资源
    最近更新 更多