【问题标题】:InstanceDouble(session) (anonymous)> received unexpected message :[]= withInstanceDouble(会话)(匿名)>收到意外消息:[] = with
【发布时间】:2019-04-07 15:17:37
【问题描述】:

我对 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(:[])

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

【问题讨论】:

    标签: ruby-on-rails ruby rspec ruby-on-rails-5


    【解决方案1】:

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

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

    1. 接收消息
    2. 出乎意料

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

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

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

    第二个也很容易。有一个名为expect 的方法可以让你告诉一个double 来期待某个消息。所以,我们需要做的就是建立一个期望。

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

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

    我们所要做的就是不假思索地复制粘贴这些信息:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2013-08-05
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多