10

这是一个困扰我一段时间的问题。我正在构建一个 API 函数,它应该接收 json 中的数据和 json 中的响应。我的控制器测试运行良好(因为我抽象出数据已经从 JSON 解码,并且只需要解释答案)。

我也知道该函数运行良好,因为我使用 curl 使用 JSON 参数对其进行了测试,并且它运行良好。(例如: curl -i --header "Accept: application/json" --header "Content-Type: application/json" -d '{"test":{"email":"andreo@benjamin.dk"}} ')

但显然我想编写请求(功能)测试来自动测试它,我认为它们应该像 curl 一样工作,即像外部调用一样点击我的服务。这意味着我想以 JSON 格式传递参数并接收答案。我很迷茫,因为我看到的所有示例都将参数视为已经解码的参数。

我的问题是:我想以 JSON 格式发送参数和请求时遵循了一个错误的前提,因为我将测试 rails 的工作原理,因为这是它的责任?但我想看看我的代码对错误参数的鲁棒性有多强,并想尝试使用 JSON。

这种类型的东西:

it "should return an error if there is no correct email" do
    params = {:subscription => {:email => "andre"}}

    post "/magazine_subscriptions", { 'HTTP_ACCEPT' => "application/json", 'Content-Type' => 'application/json', 'RAW_POST_DATA' => params.to_json }
end

你知道这怎么可能吗?如果您认为我测试错了,请告诉我。

祝一切顺利,

安德烈

4

2 回答 2

19

我在这里的一篇文章中找到了答案(RSpec request test merges hashes in array in POST JSON params),我认为我做错了与请求的参数有关。

所以这有效:

it "should return an error if there is no correct email" do
    params = {:subscription => {:email => "andre"}}

    post "/magazine_subscriptions", params.to_json, {'ACCEPT' => "application/json", 'CONTENT_TYPE' => 'application/json'}
end
于 2013-09-08T11:52:03.647 回答
1
describe '#create' do 
  let(:email) {'andre'}
  let(:attrs) {{email: email}}
  let(:params) {{format: :json, subscription: attrs}}

  it "should return an error if there is no correct email" do
    post "/magazine_subscriptions", params
  end
end
于 2014-03-10T13:19:16.073 回答