我正在尝试使用WebMock对Controller的请求进行存根。但是,在创建存根时,请求并没有按照我预期或希望的方式被拦截。
Controller只根据查询参数呈现JSON:
def index
render json: MyThing.search(params[:query]).as_json(only: [:id], methods: [:name_with_path])
end它的顽固表现如下:
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中。
在规范文件中,我包括:
require 'support/feature_helper'
require 'support/feature_matchers'
require 'webmock/rspec'
WebMock.disable_net_connect!然而,当我将文本输入React组件时,实际发生的情况是,无论是哪个WebMock存根,它都会击中Controller,发出DB请求,并且由于测试环境的某些限制而失败。我对它应该如何工作的理解是,当向mything_url发出请求时,它应该被WebMock拦截,它将返回我预定义的值,并且根本不会命中Controller。
我的猜测是,不知何故,我在嘲弄错误的URI,但老实说,在这一点上,我真的很不确定。任何和所有的投入都是非常感谢的,我很高兴澄清我在这里提出的任何观点。非常感谢!
发布于 2016-10-06 17:28:45
最终解决了我的问题的是坚持这个模型。我曾经尝试过在Controller上顽固不化,但遇到了一些问题;然而,这段代码成功了:
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操作时也是如此。上床睡觉,醒来,用我认为相同的语法再试一次,它成功了。我只是要慢慢地后退,感谢上帝的代码。
发布于 2020-04-14 20:07:45
如果弹性搜索是问题所在,那么不妨试试。
# in your gemfile
group :test do
gem 'webmock'
end在spec_helper中是这样的:
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的文档。
https://stackoverflow.com/questions/39872994
复制相似问题