【问题标题】:Rails API Server RSpec test always returns empty JSONRails API Server RSpec 测试总是返回空 JSON
【发布时间】:2017-04-11 12:54:24
【问题描述】:

我在测试控制器时遇到问题。所有测试都运行良好,控制器是基本的 CRUD,但一个 #index 操作总是返回一个空的 JSON 主体。我已经尝试了所有方法并且没有想法,所以也许你可以帮助我。

这是我的代码

控制器

class CarUsersController < ApplicationController

def index
  @car_users = CarUser.all

  render json: @car_users
end

迁移

class CreateCarUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :car_users do |t|
      t.integer :car_id
      t.integer :owner_user_id
      t.integer :rental_user_id
      t.integer :service_user_id
      t.string :role

      t.timestamps
    end
  end
end

型号

class CarUser < ApplicationRecord

  rolify
  belongs_to :car
  belongs_to :owner_user
  belongs_to :rental_user
  belongs_to :service_user

  validates :role, presence: true
  validates :role, acceptance: { accept: ['owner', 'rental', 'service'] }

end

RSpec 工厂

require 'faker'

FactoryGirl.define do
  factory :car_user do |p|

    p.owner_user_id { Faker::Number.digit }
    p.driver_user_id { Faker::Number.digit }
    p.service_user_id { Faker::Number.digit }
    p.car_id { Faker::Number.digit }
    p.role 'owner'

    end
end

还有 RSpec 测试

...
it 'returns all car users' do
  FactoryGirl.create(:car_user, rental_user_id: 4, car_id: 2, role: 'rental')
    get :index
    puts response.body
    parsed_response = JSON.parse(response.body)

    expect(parsed_response[0]['id']).to eq(1)
    expect(parsed_response[0]['rental_user_id']).to eq(4)
    expect(parsed_response[0]['car_id']).to eq(2)
    expect(parsed_response[0]['role']).to eq('rental')
end
...

我总是收到以下错误:

CarUsersController returns all car users
Failure/Error: expect(parsed_response[0]['rental_user_id'].to eq(4)

  expected: 4
       got: nil

  (compared using ==)

【问题讨论】:

  • puts response.body 行输出了什么? 编辑:您的工厂不接受rental_user 关联,可能就是这样。此外,您应该尽量避免在您的期望中进行硬编码(尤其是对于模型 ID)。存储您从工厂返回的 car_user 对象并与之进行比较。
  • 只是 [{"id":1}]
  • 你使用序列化器吗?
  • @MrDanA:你的意思是:car_user = parsed_response 然后 expect(car_user.rental_user_id).to be(4)?
  • @radubogdan 哦,是的,好点。我创建了它,但忘记输入值......我知道我很愚蠢;)

标签: ruby-on-rails json api testing rspec


【解决方案1】:

这里的问题是您没有将rental_association 添加到您的工厂。

此外,您应该避免在您的期望范围内对值进行硬编码。相反,您可以保存 car_user 实例并与之进行比较。

car_user = FactoryGirl.create(role: "rental", ...)
...
expect(parsed_response[0]['id']).to eq(car_user.id)
expect(parsed_response[0]['role']).to eq(car_user.role)

特别是对于 ID,它们永远不会始终为 1。如果您的测试以不同的顺序运行,并且首先创建了另一个 CarUser,那么现在总是会失败。此外,如果您更改了发送到工厂的单个值,则必须在任何地方手动更改它。在这种情况下,例如,如果您将角色更改为“所有者”,您现在不必更改期望线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多