【发布时间】: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