Метод Rack :: Test PUT с JSON не может преобразовать JSON в params - PullRequest
0 голосов
/ 25 января 2012

В настоящее время я использую рельсы 3.1.3, огурцы-рельсы 1.2.1, rspec-рельсы 2.8.1 и json_spec 0.8.0.Я создаю полноценный API веб-сервиса, который будет использоваться приложением Android.Я использую методы TDD / BDD и смог успешно протестировать действия веб-служб с помощью get () и post () в моих определениях шагов Cucumber.Однако при использовании put () я столкнулся с проблемой.

Вот мой device_update.feature:

Feature: Updating a Device
  The web service should accept a PUT request to update device settings.

  Scenario: The device information is updated when valid data is posted to the web service.
    Given a device exists
    When I put "/services/devices/4A3CABD4C4DE6E9F.json" with:
      """
      {
        "device": {
          "carrier": "SPRINT"
        }
      }
      """    
    Then the JSON should be:
      """
      {
        "message": "Device updated.",
        "response_code": 1
      }
      """

Мое определение шага:

When /^I get "([^"]*)"$/ do |path|
  get(path)
end

When /^I post to "([^"]*)" with:$/ do |path, json_string|
  post(path, json_string, {"CONTENT_TYPE" => "application/json"})
end

When /^I put "([^"]*)" with:$/ do |path, json_string|
  put(path, json_string, {"CONTENT_TYPE" => "application/json"})
end

Когда тест запущен, я получаю следующее:

When I put "/services/devices/4A3CABD4C4DE6E9F.json" with:
  """
  {
    "device": {
      "carrier": "SPRINT"
    }
  }
  """
  You have a nil object when you didn't expect it!
  You might have expected an instance of Array.
  The error occurred while evaluating nil.[] (NoMethodError)
  ./app/controllers/services/devices_controller.rb:75:in `update'
  ./features/step_definitions/request_steps.rb:10:in `/^I put "([^"]*)" with:$/'
  features/services/devices/device_update.feature:7:in `When I put "/services/devices/4A3CABD4C4DE6E9F.json" with:'
Then the JSON should be:
  """
  {
    "message": "Device updated.",
    "response_code": 1
  }
  """

Когда я просматриваю журнал, я вижу следующее:

Started PUT "/services/devices/4A3CABD4C4DE6E98.json" for 127.0.0.1 at 2012-01-25 11:36:16 -0800
Processing by Services::DevicesController#update as JSON
Parameters: {"{\n  \"device\": {\n    \"carrier\": "SPRINT"\n  }\n}"=>nil, "id"=>"4A3CABD4C4DE6E98"}

Я обрезал активные записи вызовов как они естьне имеет значения.Очевидно, что JSON не преобразуется в надлежащие параметры, и поэтому я получаю неожиданный ноль.

Есть мысли о том, как заставить эту работу работать?

1 Ответ

1 голос
/ 26 января 2012

Вы не должны передавать строку в put.Он заботится о преобразовании в строку JSON, что, как правило, хорошо.Здесь происходит то, что ваша строка JSON снова JSONified на put.

. Сначала вы должны проанализировать строку JSON и передать полученный объект в put:

When /^I put "([^"]*)" with:$/ do |path, json_string|
  payload = JSON.parse(json_string)
  put(path, payload, {"CONTENT_TYPE" => "application/json"})
end

Также тип контента, вероятно, не нужен.

...