InstanceDouble(会话)(匿名)>;收到意外消息:[]=WITH [英] InstanceDouble(session) (anonymous)> received unexpected message :[]= with
本文介绍了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_id
和123
的消息[]=
,但这是意想不到的。
让我们应用一些基本逻辑。问题是:
- 接收消息
- 这不是预期的
因此,您可以做两件事来删除该邮件:
- 不发送邮件或
- 告诉替身等待消息
session[:cart_id] = current_cart.id
,因为那是您调用[]=
的唯一位置。但是,我认为这不是您想要的。
第二个也很简单。有一个名为expect
的方法,它允许您告诉Double期待特定的消息。所以我们要做的就是树立一个预期。
好的失败消息在测试框架中非常重要,值得庆幸的是,RSpec确实有好的失败消息。失败消息应该告诉您如何继续进行测试,您引用的消息包含我们需要的所有信息:
- 引发失败的Double的名称(
session
) - 导致失败的意外消息的名称(
[]=
) - 甚至传递给消息的参数(
:cart_id
和123
)
我们所要做的就是,不假思索地直接复制和粘贴以下信息:
expect(session).to receive(:[]=).with(:cart_id, 123)
或者,如果我们希望我们的测试不那么脆弱,也不想对123
进行硬编码,我们还可以这样做:
expect(session).to receive(:[]=).with(:cart_id, instance_of(Integer))
这篇关于InstanceDouble(会话)(匿名)>;收到意外消息:[]=WITH的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文