导轨模型测试 - should_receive方法不起作用



我正在编写一个非常简单的方法。每当推荐人推荐 5 个人成为新用户时,我希望他们获得退款。这意味着,当创建新用户时,check_referer有一个方法可以检查推荐他们的人(如果此人存在)是否应该获得退款,因为他们现在总共推荐了 5 人。

在测试日志中,根据 puts 语句,我可以判断代码正在工作,并且 refund_membership_fees_paid 方法确实被调用了一次。但是测试一直失败,并显示:

Failure/Error: @referer.should_receive(:refund_membership_fees_paid).exactly(1).times
   (#<User:0x007fbf46bf1c58>).refund_membership_fees_paid(any args)
       expected: 1 time with any arguments
       received: 0 times with any arguments

测试代码:

describe User, "Test refund_membership_fees_paid method is called" do
  before do
    @referer = User.new()
    @referer.save(validate:false)
    RefererRefundAlert.stub_chain(:new, :async, :perform)
  end
  it "at 5 users" do
    5.times do |index|
        u = User.new(referred_by: @referer.id)
        u.save(validate:false)
    end
    @referer.should_receive(:refund_membership_fees_paid).exactly(1).times
  end
end

型号代码:

def check_referer
  if self.referred_by.present? && User.where(referred_by: self.referred_by).count == 5
    User.find(self.referred_by).refund_membership_fees_paid
  end
end
def refund_membership_fees_paid
  puts "refund_membership_fees_paid method"
  RefererRefundAlert.new.async.perform(self.id)
end
User.find

返回与@referer相同的对象;它将返回一个不同的User实例,该实例表示数据库中的同一用户。

您可以验证是否将正确的用户 ID 传递到 RefererRefundAlert.new.async.perform 中,而不是检查是否调用了refund_membership_fees_paid

此外,正如其他人提到的,您应该在运行测试方法之前设置您的期望。

RefererRefundAlert.new.async.should_receive(:perform)
      .with(@referer.id).exactly(1).times
5.times do |index|
  u = User.new(referred_by: @referer.id)
  u.save(validate:false)
end

should_receive 的用途是设置对以下操作的期望。

例如,如果您的account.close操作应该记录关闭,则测试将是...

  logger.should_receive(:account_closed)
  account.close

所以你的例子应该重组,把测试放在第一位......

@referer.should_receive(:refund_membership_fees_paid).exactly(1).times
5.times {User.new(referred_by: @referer.id).save(validate: false)}

最新更新