gpt4 book ai didi

ruby-on-rails - InstanceDouble( session )(匿名)> 收到意外消息 :[]= with

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:15 25 4
gpt4 key购买 nike

我对 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

规范

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

绑定(bind).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(:[])

但是还是不行,还是一样的错误

最佳答案

该消息告诉您,您的替身收到了带有参数 :cart_id123 的消息 []= 但没想到.

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

  1. 收到消息
  2. 这出乎意料

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

  1. 不发送消息或
  2. 告诉替身等待消息

第一个很简单:只需删除第 14 行,上面写着 session[:cart_id] = current_cart.id 因为这是您唯一调用 []= 的地方.但是,我认为这不是您想要做的。

第二个也很简单。有一个名为 expect 的方法,它允许您告诉替身等待某个消息。因此,我们需要做的就是设定预期。

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

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

我们所要做的就是,想都没想,直接复制粘贴这些信息:

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

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

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

关于ruby-on-rails - InstanceDouble( session )(匿名)> 收到意外消息 :[]= with,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com