InstanceDouble(会话)(匿名)>收到意外消息:[]=WITH [英] InstanceDouble(session) (anonymous)> received unexpected message :[]= with

查看:18
本文介绍了InstanceDouble(会话)(匿名)>收到意外消息:[]=WITH的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的RSpec行为有问题。我尝试为服务编写测试,其中我使用session读取一些值并覆盖此值。

例如我要测试的内容

class CurrentCartService
  attr_reader :user, :session

  def initialize(user, session)
    @user = user
    @session = session
  end

  def cart_id
    { id: session[:cart_id] }
  end

  def assigne_cart_to_session
    session[:cart_id] = current_cart.id
  end

spec

describe CurrentCartService do
  let(:current_user) { user }
  let(:session) { double('session') }

  let!(:cart) { create(:cart) }

  subject { described_class.new current_user, session }

  before do
    allow(session).to receive(:[]).and_return(cart.id)
  end

  describe '#call' do
    context 'when user is not signed' do
      let(:user) { nil }
      it { subject.call }
    end
  end
end

binding.pry

session[:cart_id]
=> 574
session[:cart_id] = 123
RSpec::Mocks::MockExpectationError: #<InstanceDouble(session) (anonymous)> received unexpected message :[]= with (:cart_id, 123)

如何修复此问题?我试图写一些expect

expect(session).to receive(:[])

但它不起作用,仍然是同一个错误

推荐答案

该消息告诉您,您的Double收到了带有参数:cart_id123的消息[]=,但这是意想不到的。

让我们应用一些基本逻辑。问题是:

  1. 接收消息
  2. 这不是预期的

因此,您可以做两件事来删除该邮件:

  1. 不发送邮件或
  2. 告诉替身等待消息
第一个很简单:只需删除第14行,它显示session[:cart_id] = current_cart.id,因为那是您调用[]=的唯一位置。但是,我认为这不是您想要的。

第二个也很简单。有一个名为expect的方法,它允许您告诉Double期待特定的消息。所以我们要做的就是树立一个预期。

好的失败消息在测试框架中非常重要,值得庆幸的是,RSpec确实有好的失败消息。失败消息应该告诉您如何继续进行测试,您引用的消息包含我们需要的所有信息:

  • 引发失败的Double的名称(session)
  • 导致失败的意外消息的名称([]=)
  • 甚至传递给消息的参数(:cart_id123)

我们所要做的就是,不假思索地直接复制和粘贴以下信息:

expect(session).to receive(:[]=).with(:cart_id, 123)

或者,如果我们希望我们的测试不那么脆弱,也不想对123进行硬编码,我们还可以这样做:

expect(session).to receive(:[]=).with(:cart_id, instance_of(Integer))

这篇关于InstanceDouble(会话)(匿名)&gt;收到意外消息:[]=WITH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆