我想测试某些实例没有接收到特定的方法调用。试着
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
传球。我做错了什么?
我被message' for #引导到了当前的不工作解决方案,并且我正在使用
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
。
更新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
发布于 2018-04-30 11:27:59
好的,这里有两个问题。首先,您正在尝试使用rspec期望值语法和mocha
作为您的模拟框架工作。这导致:
undefined method `receive' for #<RSpec::ExampleGroups::Something:0x0000000010391588>
错误,因为mocha
不知道receive
。mocha
的语法应该是:
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
的实现,如果您感兴趣的话,尽管它做的比我的示例(#stub_obj
)多一点,但是通过Mocha::Mockery
对象,概念是相同的。
https://stackoverflow.com/questions/50105319
复制相似问题