1

我正在创建一个 gem,它在它正在使用的任何应用程序中都有一个常量(在运行生成器之后),但该常量在 gem 本身中不存在。我在 gem 中遇到 RSpec 问题,没有跳过调用常量的代码部分。下面是一个简单的例子。

class Foo
  def self.do_something
    Bar.send(FakeConstant.name)  #Bar.send is a valid class and method
  end
end

foo_spec.rb

it 'does something'
  expect(Bar).to receive(send).and_return('skipped!')
  Foo.do_something
end

rspec 输出

NameError: uninitialized constant FakeConstant

我想编写测试,以便它完全跳过Bar.send调用,这样它就永远不知道它里面有一个坏常量。真的没有很好的方法来解决这个问题。

4

1 回答 1

2

RSpec 的stub_const方法允许你存根一个常量:

it 'does something'
  stub_const(FakeConstant, double(name: "Fakey McFakerson"))
  expect(Bar).to receive(send).and_return('skipped!')
  Foo.do_something
end

更多信息:https ://www.relishapp.com/rspec/rspec-mocks/docs/mutating-constants/stub-defined-constant

也就是说,我同意 BroiSatse 的观点,即提供一种更动态的方法将这些信息放入代码中可能会更好,这种方法可以在测试中以更少的技巧进行操作。

于 2016-03-17T01:14:02.220 回答