期待获得永远成功

时间:2015-11-26 12:01:34

标签: ruby-on-rails rspec

有几种情况,我的规格总是返回为真,这使得测试变得多余......

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

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

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

  

1)Achievement#call_name_method调用#name        失败/错误:期望(成就).to has_received(:call_name_method)          #期望收到call_name_method,但该对象不是间谍,或者方法没有被存根。

1 个答案:

答案 0 :(得分:0)

问题出在 rails_helper.rb

config.after(:each) do
  DatabaseCleaner.clean

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

删除该行后,规格按预期工作。虽然不需要,同事却意外地承认了这一点。

由于所有测试都取得了成功,直到现在它才引起我们的注意。