Faraday::Adapter::Test::Stubs
引入了strict_mode
,我想要该模式的更多功能:支持Faraday::FlatParamsEncoder
。 例如,如果我想多次调用具有相同查询参数a
的 HTTP 请求,我希望测试存根检查具有不同值的相同参数是否都正确传递。class Client
def initialize(conn)
<strong i="10">@conn</strong> = conn
end
def sushi(jname, params: {})
res = @conn.get("/#{jname}", params)
data = JSON.parse(res.body)
data['name']
end
end
RSpec.describe Client do
let(:stubs) { Faraday::Adapter::Test::Stubs.new(strict_mode: true) }
let(:conn) { Faraday.new(request: { params_encoder: Faraday::FlatParamsEncoder }) { |b| b.adapter(:test, stubs) } }
let(:client) { Client.new(conn) }
it 'handles the same multiple URL parameters' do
# The same parameter `a` is expected to appear multiple times with different values.
stubs.get('/ebi?a=x&a=y&a=z') { [200, { 'Content-Type' => 'application/json' }, '{"name": "shrimp"}'] }
# Test should pass
expect(client.sushi('ebi', params: { a: %w[x y z] })).to eq('shrimp')
# Test should not pass due to the lack of "x" and "y" for `a`
# expect(client.sushi('ebi', params: { a: %w[z] })).to eq('shrimp')
stubs.verify_stubbed_calls
end
end
你怎么认为? 如果有意义,我想打开一个拉取请求。
嗨@yykamei ,以上对我来说很有意义,我欢迎公关。
出于好奇,上述测试目前发生了什么? 最后一个通过了吗?
另外,请记住main
分支现在指向即将发布的 v2.0 版本。
如果您也希望在 1.x 版本中使用此功能,则需要从1.x
分支中分离出来👍
嗨@iMacTia ,感谢您的回复。
出于好奇,上述测试目前发生了什么? 最后一个通过了吗?
哦,好像没有传入最新的1.x
分支。 我认为这是因为Stub#params
是用Faraday::Utils.parse_nested_query
构造的; 它看起来像是覆盖了以前的查询参数。
Randomized with seed 45661
Client
handles the same multiple URL parameters (FAILED - 1)
Failures:
1) Client handles the same multiple URL parameters
Failure/Error:
raise Stubs::NotFound, "no stubbed request for #{env[:method]} "\
"#{normalized_path} #{env[:body]}"
Faraday::Adapter::Test::Stubs::NotFound:
no stubbed request for get /ebi?a=x
# ./lib/faraday/adapter/test.rb:253:in `call'
# ./lib/faraday/rack_builder.rb:154:in `build_response'
# ./lib/faraday/connection.rb:511:in `run_request'
# ./lib/faraday/connection.rb:200:in `get'
# ./ok.rb:11:in `sushi'
# ./ok.rb:30:in `block (2 levels) in <top (required)>'
Finished in 0.00391 seconds (files took 0.78136 seconds to load)
1 example, 1 failure
Failed examples:
但是,如果我像这样更改代码,测试就会通过。 我重写了问题描述。
diff --git a/a.rb b/a.rb
index c4b7084..91d795d 100644
--- a/a.rb
+++ b/a.rb
@@ -27,7 +27,7 @@ RSpec.describe Client do
expect(client.sushi('ebi', params: { a: %w[x y z] })).to eq('shrimp')
# Test should not pass due to the lack of "y" and "z" for `a`
- expect(client.sushi('ebi', params: { a: %w[x] })).to eq('shrimp')
+ expect(client.sushi('ebi', params: { a: %w[z] })).to eq('shrimp')
stubs.verify_stubbed_calls
end
end
不管怎么说,还是要谢谢你。 我要做出一些改变💪
此问题已通过 #1316 解决。
谢谢!
最有用的评论
另外,请记住
main
分支现在指向即将发布的 v2.0 版本。如果您也希望在 1.x 版本中使用此功能,则需要从
1.x
分支中分离出来👍