【问题标题】:ActionController::UnknownFormat with rspec and post requestActionController::UnknownFormat 与 rspec 和发布请求
【发布时间】:2014-02-24 07:01:08
【问题描述】:

我正在尝试在 rails 4 上使用 rspec 进行一些集成测试,但在运行测试时我总是收到“ActionController::UnknownFormat”异常。

我尝试了两种不同的方法:

Failure/Error: post sensors_path, sensor: @sensor_attributes.to_json
ActionController::UnknownFormat:
    ActionController::UnknownFormat


Failure/Error: post sensors_path, sensor: @sensor_attributes, format: :js
ActionController::UnknownFormat:
    ActionController::UnknownFormat

这是 rspec 代码:

it "should change the number of sensors" do
    lambda do
        post sensors_path, sensor: @sensor_attributes.to_json 
        end.should change(Sensor, :count).by(1)
    end

it "should be successful" do
    post sensors_path, sensor: @sensor_attributes, format: :js
    response.should be_success
end

这是控制器的创建语句:

def create
    respond_to do |format|
        format.json do
            @sensor = Sensor.new(params["sensor"])
            @sensor.uuid = SecureRandom.uuid

            @sensor.save

            render nothing: true
        end
    end
end

还有sensor_attributes:

before do
    @sensor_attributes = { name: "Testname", description: "This is a Test-Description." }
end

还有路线:

resources :sensors

知道出了什么问题吗?

【问题讨论】:

  • 你要测试create方法吗?
  • 哦,对不起。但你得出了正确的结论。我想测试 create 方法。
  • 这些不是集成规范......它们是简单的控制器规范,因此应该在带有post :create 的控制器的上下文中进行测试。
  • 最后我通过将 rspec-rails 升级到 3.0.0beta2 来运行它。也许这是 rspec-rails 2.x 和 rails 4.0 之间的问题。

标签: ruby-on-rails rspec ruby-on-rails-3.2


【解决方案1】:

您在控制器中使用json 格式,但您在测试中通过了format: :js

应该是:

post sensors_path, sensor: @sensor_attributes, format: :json

【讨论】:

  • 这也没有帮助。但是在切换 ti rspec-rails 3.0.0.beta2 (见上面的评论)格式后: :json 是必要的。
【解决方案2】:

这是为未来的读者准备的。 不知何故,答案对我没有帮助。

像下面这样的写作对我有用 -

params = {
    sensor: { 
       name: "Testname", 
       description: "This is a Test-Description." 
    },
    format: :json
  }

  post sensors_path, params

【讨论】:

    【解决方案3】:

    .json 附加到路径也对我有用(因为我使用的是共享 rspec 示例,不能只附加 format: json)...

    发布“#{sensors_path}.json”,传感器:@sensor_attributes

    【讨论】:

      【解决方案4】:
      it "creates a new sensor" do
          expect {
             post :create, {:sensor => {here_you_need_to_put_the_variables_which_are_needed_to_create_a_sensor}}
          }.to change(Sensor, :count).by(1)
      end
      

      在你的create方法中,下面一行

      @sensor = Sensor.new(params["sensor"])
      

      应该是:

      @sensor = Sensor.new(params[:sensor])
      

      我不知道你代码的结构。我给出的所有解决方案代码都是基于我自己的假设。

      【讨论】:

      • 如果你给出控制器和模型的代码,那我回答会更有帮助。
      • params 哈希是一个 HashWithIndifferentAccess - 按字符串或符号索引是相同的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2014-05-21
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多