首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails rspec未定义的用于#<RSpec::ExampleGroups的“接收”方法:

Rails rspec未定义的用于#<RSpec::ExampleGroups的“接收”方法:
EN

Stack Overflow用户
提问于 2018-04-30 17:22:29
回答 1查看 1.8K关注 0票数 1

我想测试某些实例没有接收到特定的方法调用。试着

代码语言:javascript
复制
RSpec.describe 'something' do
  before { subject.stubs(foo: 'bar') }
  it { is_expected.to_not receive(:foo) }
end

给我

代码语言:javascript
复制
Failure/Error: it { is_expected.to_not receive(:foo) }

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

并试图

代码语言:javascript
复制
RSpec.describe 'something else' do
  before { subject.stubs(foo: 42) }
  it { subject.expects(:foo).never; subject.foo }
end

传球。我做错了什么?

我被message' for #引导到了当前的不工作解决方案,并且我正在使用

代码语言:javascript
复制
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!不幸的是,对于我的特定用例,我仍然需要对方法进行存根。为什么这个还在过去?

代码语言:javascript
复制
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永远不会被发送。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 19:27:59

好的,这里有两个问题。首先,您正在尝试使用rspec期望值语法和mocha作为您的模拟框架工作。这导致:

代码语言:javascript
复制
undefined method `receive' for #<RSpec::ExampleGroups::Something:0x0000000010391588>

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

代码语言:javascript
复制
it { expects(:foo).never }  

您的下一个问题是,前置块正在阻塞foo,因此它永远不会到达接收方。因此,您的第二个案例通过了,因为subject实际上从未接收到foo,因为固执拦截了调用。

示例:

代码语言:javascript
复制
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对象,概念是相同的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50105319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档