首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WebMock而不是拦截请求

使用WebMock而不是拦截请求
EN

Stack Overflow用户
提问于 2016-10-05 11:40:20
回答 2查看 1.9K关注 0票数 0

我正在尝试使用WebMock对Controller的请求进行存根。但是,在创建存根时,请求并没有按照我预期或希望的方式被拦截。

Controller只根据查询参数呈现JSON:

代码语言:javascript
复制
def index      
  render json: MyThing.search(params[:query]).as_json(only: [:id], methods: [:name_with_path])
end

它的顽固表现如下:

代码语言:javascript
复制
mything_val = { ...json values... }
stub_request(:any, mything_path).with(query: { "query" => "a+thing" }).to_return(body: mything_val, status: 200)
page.find('.MyThingInput > input').set('a thing')

# Note: I've tried this with and without the `query:` parameter, as well as 
with and without specifying header info.

这是在触发一个反应元件。它所做的是,当输入一个或多个单词时,它用输入的值向mything_path发送一个AJAX请求,该值作为JSON返回几个关于用户可能意味着什么的建议。它们位于li元素中的.MyThingInput-wrapper中。

在规范文件中,我包括:

代码语言:javascript
复制
require 'support/feature_helper'
require 'support/feature_matchers'
require 'webmock/rspec'
WebMock.disable_net_connect!

然而,当我将文本输入React组件时,实际发生的情况是,无论是哪个WebMock存根,它都会击中Controller,发出DB请求,并且由于测试环境的某些限制而失败。我对它应该如何工作的理解是,当向mything_url发出请求时,它应该被WebMock拦截,它将返回我预定义的值,并且根本不会命中Controller。

我的猜测是,不知何故,我在嘲弄错误的URI,但老实说,在这一点上,我真的很不确定。任何和所有的投入都是非常感谢的,我很高兴澄清我在这里提出的任何观点。非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-06 17:28:45

最终解决了我的问题的是坚持这个模型。我曾经尝试过在Controller上顽固不化,但遇到了一些问题;然而,这段代码成功了:

代码语言:javascript
复制
before do
  mything_value = [{ "id" => "fb6135d12-e5d7-4e3r-b1h6-9bhirz48616", "name_with_path" => "New York|USA" }]
  allow(MyThing).to receive(:search).and_return(mything_value.to_json)
end

这样,它仍然会命中控制器,但会删除DB查询,这是真正的问题,因为它使用了Elasticsearch (而不是在测试模式下运行)。

对于像这样硬编码JSON,我不太满意,但我尝试了一些其他方法,但都没有成功。老实说,在这一点上,我只想说明什么是可行的。

有趣的是,在输入建议之前,我已经尝试过这个方法,但是语法不太正确;在顽强地执行Controller操作时也是如此。上床睡觉,醒来,用我认为相同的语法再试一次,它成功了。我只是要慢慢地后退,感谢上帝的代码。

票数 1
EN

Stack Overflow用户

发布于 2020-04-14 20:07:45

如果弹性搜索是问题所在,那么不妨试试。

  • 安装Webmock
代码语言:javascript
复制
# in your gemfile
group :test do
gem 'webmock'
end
  • 保存对elasticsearch的请求并返回JSON

在spec_helper中是这样的:

代码语言:javascript
复制
  config.before(:each) do
    WebMock.enable!
    WebMock.stub_request(:get, /#{ELASTICSEARCH_URL}/).to_return(body: File.read('spec/fixtures/elasticsearch/search-res.json'))ELASTICSEARCH_URL
    # and presumably, if you are using elasticsearch-rails, you'd want to stub out the updating as well:
    WebMock.stub_request(:post, /#{ELASTICSEARCH_URL}/).to_return(status: "200")
    WebMock.stub_request(:put, /#{ELASTICSEARCH_URL}/).to_return(status: "200")
    WebMock.stub_request(:delete, /#{ELASTICSEARCH_URL}/).to_return(status: "200")
  end

当然,这个存根输出对弹性搜索的所有调用,并对所有答案返回相同的JSON。如果您需要针对每个查询提供不同的响应,请深入了解webmock的文档。

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

https://stackoverflow.com/questions/39872994

复制
相关文章

相似问题

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