0

我试图存根从构造函数调用的全局函数。我正在使用 Rspec 和 Rspec-mocks。这是要测试的代码:

def foo
  'foo'
end

class Bar
  def initialize
    @bar = foo
  end

  def bar
    @bar
  end
end

这是测试:

describe 'bar'
  it 'calls foo' do
    expect(self).to receive(:foo) { 'bar' }

    expect(Bar.new.bar).to eq('bar')
  end
end

测试失败并显示以下消息:

     Failure/Error: expect(Bar.new.bar).to eq('bar')

       expected: "bar"
            got: "foo"

       (compared using ==)

如何存根全局函数foo

PS:如果从另一个全局函数调用,则按expect(self).to receive(:foo) { 'bar' }预期工作。foo

4

2 回答 2

1

最简单的解决方案可能是 uses #allow_any_instance_of,它之所以有效,是因为“全局”函数实际上Kernel是 Ruby 中的方法。但是由于文档不鼓励在全球范围内使用存根类,我想我至少会提供一个替代方案:

def foo
  'foo'
end

class Bar
  def self.get_foo
    foo
  end

  def initialize
    @bar = self.class.get_foo
  end

  def bar
    @bar
  end
end

describe Bar do
  it 'gets foo' do
    expect(Bar).to receive(:get_foo).and_return('bar')

    expect(Bar.new.bar).to eq('bar')
  end
end

当然,如果可能的话,最好放弃Kernel方法,只使用类方法。

于 2019-04-11T21:09:01.583 回答
0
allow_any_instance_of(Bar).to receive(:foo) { 'bar' }
于 2019-04-11T18:59:01.550 回答