【问题标题】:Expect to receive always succeeds期望接收总是成功
【发布时间】:2015-11-26 12:01:33
【问题描述】:

在某些情况下,我的规范总是返回为真,从而使测试变得多余...

Achievement 模型为例:

class Achievement < ActiveRecord::Base
  has_many :stages

  def call_name_method
    name
  end

  def name
    key
  end
end

# for simplicity sake, I'm just testing a method which simply calls another method.

achievement_specs.rb

require 'rails_helper'

describe Achievement do
  describe '#call_name_method' do
    subject { achievement.call_name_method }
    let(:achievement) { create(:achievement) }

    it 'calls #name' do
      expect(achievement).to receive(:name)
      subject
    end
  end
end

这个测试成功了,但是我可以把它改成expect(achievement).to receive(:foobar),它仍然会成功,虽然我没有调用foobar

根据this answer,这是正确的语法,但它永远不会失败。这是一个错误吗?

我也尝试过使用.to have_received(:call_name_method),但这会导致这个错误:

1) 成就#call_name_method 调用#name 失败/错误:expect(achievement).to have_received(:call_name_method) # 预计会收到 call_name_method,但该对象不是间谍或方法尚未被存根。

【问题讨论】:

  • achievement.stages 是一个关系; Stage 也没有方法register!。你到底想测试什么?
  • 我想测试Achievement的register!方法是否在它的stage上调用了register!方法,我用它的方法添加了Stage模型
  • 主题{成就.call_name_method}的成就是什么?是否需要覆盖下一行的成就?
  • 成就是一个工厂,它确实在“是”之后定义了行。我也可以换线,没有区别
  • 代码看起来不错。错误必须在其他地方。如果您提供了一个我们可以运行的最小示例,那就完美了。

标签: ruby-on-rails rspec


【解决方案1】:

问题出在 rails_helper.rb

config.after(:each) do
  DatabaseCleaner.clean

  RSpec::Mocks.teardown # <-- this line was fault
end

删除该行后,规格按预期工作。一位同事不小心犯了这个错误,尽管这不是必需的。

由于所有测试都“成功”,所以直到现在才引起我们的注意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多