Ruby on rails 如何使gemwebmock与包含[方括号]的json一起工作?
讨论中的Rails应用程序在测试中使用了Rspec、Capybara和WebMock 在一个测试场景中,此代码起作用:Ruby on rails 如何使gemwebmock与包含[方括号]的json一起工作?,ruby-on-rails,json,webmock,Ruby On Rails,Json,Webmock,讨论中的Rails应用程序在测试中使用了Rspec、Capybara和WebMock 在一个测试场景中,此代码起作用: response = RestClient.post 'the.domain.com', { "dados": { "head": { "servico": "autenticacao", "chave": "" }, "data": { "empresa": "my_n
response = RestClient.post 'the.domain.com',
{
"dados": {
"head": {
"servico": "autenticacao",
"chave": ""
},
"data": {
"empresa": "my_name",
"login": "my_login",
"senha": "my_password"
}
}
}.to_json
RSpec.configure do |config|
config.before(:each) do
stub_request(:any, 'the.domain.com').
with( body: hash_including(
{"dados": {
"head": {
"servico": "autenticacao",
"chave": ""
},
"data": {
"empresa": "my_name",
"login": "my_login",
"senha": "my_paasword"
}
}}.to_json
) ).to_return(
status: 200,
body: {"dados": {"btms": {"chave": "returned_key"}}}.to_json,
headers: {}
)
end
end
但在同一场景中,紧接着发生的这一次并没有:
data = []
data << {
"cdg_tipo_transporte": "3"
}
response = RestClient.post 'the.domain.com',
{
"dados": {
"head": {
"servico": "reserva_salva_lote",
"chave": response["dados"]["btms"]["chave"]
},
"data": data
}
}.to_json
RSpec.configure do |config|
config.before(:each) do
data = []
data << {
"cdg_tipo_transporte": "3"
}
stub_request(:any, 'the.domain.com').
with( body: hash_including(
{"dados": {
"head": {
"servico": "reserva_salva_lote",
"chave": "returned_key"
},
"data": data
} }.to_json
) ).to_return(
status: 200,
body: {"Status?": "OK"}.to_json,
headers: {}
)
end
end
hash\u include
获取要匹配的键名和键值对,您正在将{…}.to\u json
传递给它,因此它将尝试将整个json值作为键进行匹配
另外,您的第二个请求存根希望
dados.head.chave
等于“1234abcd”
,但第一个存根在响应[“dados”][“btms”][“chave”]中返回“returned\u key”
而且存根显然不匹配,导致WebMock::NetConnectNotAllowedError
您能显示错误的堆栈跟踪吗?(错误名称、行号等)您正在对请求进行存根,该请求应为“chave”:“1234abcd”
为什么不直接使用它而不是“chave”:响应[“dados”][“btms”][“chave”]
?这可能吗?在存根中有一个在测试过程中分配的变量?我不能让“chave”
硬编码,因为真正的代码每次都需要从API中获取它。您是否在测试中执行真正的请求?那是个坏主意。错误表明真实HTTP连接已禁用
,您不应该在测试中执行真实HTTP请求。还有,这是你的真实代码吗?或者你去掉了一些部分,把它们混在一起?按原样复制你的规范。我不会在测试中使用真正的HTTP。我的意思是,在某种意义上,应用程序需要在生产过程中每次获取这个“chave”
值,所以我的测试不应该每次都模拟这种获取吗?在您执行响应[“dados”][“btms”][“chave”]
之前,响应中有什么内容?它实际上是一个杂烩吗?你证实了吗?response[“dados”][“btms”][“chave”]
是否像您预期的那样返回“returned\u key”?您应该在调用RestClient post方法之前创建散列,并检查散列是否符合您的实际需要。很抱歉,在这里没有实际的类键值是一次失败的尝试。它们在我的代码中匹配。如前所述,当我移除方括号时,代码是有效的,因此我知道“chave”
不是问题所在。只是注意到您正在传递{..}。要将json
传递到散列,包括,请尝试匹配有效的散列!没有使用hash\u(包括使其正确通过)。有没有地方可以让我找到这个解释?因为所有其他模拟都使用hash\u,包括
。没有它,我无法让其他的模拟工作。现在,有了这些方括号,把它拿走才有效?!我想要一个资源来帮助我更好地理解这一点。另外,如果你把它加到你的答案中,我可以选择它。
#<ActionDispatch::Cookies::CookieOverflow: ActionDispatch::Cookies::CookieOverflow>
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/cookies.rb:594:in `commit'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/cookies.rb:465:in `[]='
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/session/cookie_store.rb:117:in `set_cookie'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:363:in `commit_session'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:234:in `context'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:226:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/cookies.rb:613:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/callbacks.rb:26:in `block in call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/activesupport-5.1.6/lib/active_support/callbacks.rb:97:in `run_callbacks'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/callbacks.rb:24:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:36:in `call_app'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:24:in `block in call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/activesupport-5.1.6/lib/active_support/tagged_logging.rb:69:in `block in tagged'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/activesupport-5.1.6/lib/active_support/tagged_logging.rb:26:in `tagged'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/activesupport-5.1.6/lib/active_support/tagged_logging.rb:69:in `tagged'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:24:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/remote_ip.rb:79:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/request_id.rb:25:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/method_override.rb:22:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/runtime.rb:22:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/activesupport-5.1.6/lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/executor.rb:12:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/actionpack-5.1.6/lib/action_dispatch/middleware/static.rb:125:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/sendfile.rb:111:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/engine.rb:522:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:68:in `block in call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:53:in `each'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:53:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/capybara-3.2.1/lib/capybara/server/middleware.rb:44:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/configuration.rb:225:in `call'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:632:in `handle_request'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:446:in `process_client'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:306:in `block in run'
/Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/thread_pool.rb:120:in `block in spawn_thread'
Failure/Error: raise CookieOverflow if options[:value].bytesize > MAX_COOKIE_SIZE
ActionDispatch::Cookies::CookieOverflow:
ActionDispatch::Cookies::CookieOverflow
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:363:in `commit_session'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:234:in `context'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/session/abstract/id.rb:226:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:36:in `call_app'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:24:in `block in call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/rack/logger.rb:24:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/method_override.rb:22:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/runtime.rb:22:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/sendfile.rb:111:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/railties-5.1.6/lib/rails/engine.rb:522:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:68:in `block in call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:53:in `each'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/rack-2.0.5/lib/rack/urlmap.rb:53:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/capybara-3.2.1/lib/capybara/server/middleware.rb:44:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/configuration.rb:225:in `call'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:632:in `handle_request'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:446:in `process_client'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/server.rb:306:in `block in run'
# /Users/ViviPoit/.rvm/gems/ruby-2.3.7/gems/puma-3.11.4/lib/puma/thread_pool.rb:120:in `block in spawn_thread'