首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器规范:expect(.to)create receive(:create)阻止执行#create操作

控制器规范:expect(.to)create receive(:create)阻止执行#create操作
EN

Stack Overflow用户
提问于 2017-02-23 23:59:07
回答 1查看 1.5K关注 0票数 3

我有以下操作:

代码语言:javascript
复制
def create
  binding.pry
  @finding.save
  respond_with @project, @finding
end

运行以下测试时...

代码语言:javascript
复制
it 'balances the consecutive numbers', focus: true do
  expect {
    post :create, params: {...}
  }.to change { Finding.count }.from(0).to 1
end

...I首先显示binding.pry控制台(证明#create操作已实际执行),然后规范通过:

代码语言:javascript
复制
Finished in 4.24 seconds (files took 5.31 seconds to load)
1 example, 0 failures

现在当我添加一个expect(controller).to receive(:create)...

代码语言:javascript
复制
it 'balances the consecutive numbers', focus: true do
  expect(controller).to receive(:create) # This is new!

  expect {
    post :create, params: {...}}
  }.to change { Finding.count }.from(0).to 1
end

...and再次运行测试,我立即显示此规范失败的结果:

代码语言:javascript
复制
expected result to have changed from 0 to 1, but did not change

删除change { ... }期望值时...

代码语言:javascript
复制
it 'balances the consecutive numbers', focus: true do
  expect(controller).to receive(:create)

  post :create, params: {project_id: @project.id, finding: {requirement_id: @requirement.id}}
end

...it再次通过:

代码语言:javascript
复制
1 example, 0 failures

但是,#create中的binding.pry仍然没有被调用!

那么这是怎么回事呢?不知何故,expect(controller).to receive(:create)似乎阻止了实际的#create操作的执行!这不是我想要的。我希望它像往常一样执行。

我在这里做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-25 00:46:59

当你使用expect().to receive()时,真正的方法是被抑制的。它只是验证是否如预期那样调用了某些东西...

我们通常在我们想要测试的时候使用它,如果我们不能控制答案,或者我们想模拟答案是被调用的。

如果您希望检查是否调用了某些内容,并同时运行原始程序,则应使用:

代码语言:javascript
复制
expect(something).to receive(:some_method).and_call_original

https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/configuring-responses/calling-the-original-implementation

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

https://stackoverflow.com/questions/42420582

复制
相关文章

相似问题

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