Rails rspec undefined 方法 'receive' for #<RSpec::ExampleGroups::



我想测试某个实例是否没有收到特定的方法调用。试图

RSpec.describe 'something' do
before { subject.stubs(foo: 'bar') }
it { is_expected.to_not receive(:foo) }
end

给我

Failure/Error: it { is_expected.to_not receive(:foo) }
NoMethodError:
undefined method `receive' for #<RSpec::ExampleGroups::Something:0x0000000010391588>

并试图

RSpec.describe 'something else' do
before { subject.stubs(foo: 42) }
it { subject.expects(:foo).never; subject.foo }
end

通过。我做错了什么?

我被 Rails rspec 未定义方法"receive_message"定向到当前不起作用的解决方案,用于 #

RSpec 3.7
- rspec-core 3.7.1
- rspec-expectations 3.7.0
- rspec-mocks 3.7.0
- rspec-support 3.7.1

更新1:我使用的是webmock而不是rspec-mocks

更新2:我正在使用webmockmocha

更新3:感谢您的所有解释,@engineersmnky!不幸的是,对于我的特定用例,我仍然需要存根该方法。为什么这个还在通过?

require 'rspec'
require 'mocha'
RSpec.configure do |config|
config.mock_with :mocha
end
RSpec.describe 'something' do
# passes
it 'can hide from foo' do 
subject.stubs(:foo)
expects(:foo).never
subject.foo
end
end

不同的是,我试图表达我希望信号永远不会:foo发送。

好的,这里有 2 个问题。首先,您正在尝试将 rspec 期望语法与mocha一起使用作为模拟框架的工作。这会导致:

undefined method `receive' for #<RSpec::ExampleGroups::Something:0x0000000010391588>

错误,因为mocha不知道receivemocha的语法应为:

it { expects(:foo).never }  

您的下一个问题是块之前foo存根,因此它永远不会真正到达接收器。因此,您的第二种情况通过了,因为subject从未真正收到foo因为存根拦截了调用。

例:

require 'rspec'
require 'mocha'
RSpec.configure do |config|
config.mock_with :mocha
end
def stub_obj(obj,method_list)
Class.new(SimpleDelegator) do 
method_list.each do |k,v| 
define_method(k) {v}
end
end.new(obj)
end
RSpec.describe 'something' do
subject {mock('subject')}
#passes 
it { expects(:foo).never }
# fails 
it { subject.expects(:foo).never; subject.foo }
# passes 
it 'can hide from foo' do 
subject.stubs(:foo)
subject.expects(:foo).never
subject.foo
end
context 'kind of like this' do
# passes
it 'hides with a stubbed method' do
stubber = stub_obj(subject, foo: 'bar')
subject.expects(:foo).never
stubber.foo
end
# fails 
it 'cannot hide from a non-stubbed method' do
stubber = stub_obj(subject, foo: 'bar')
subject.expects(:bar).never
stubber.bar
end
end
end

如果您有兴趣,这里是Object#stubs的实现,虽然它通过Mocha::Mockery对象比我的示例(#stub_obj(做得更多,但概念是相同的。

相关内容

最新更新