Ruby on rails 如何最好地测试控制器变量分配的多个关联?
我正在尝试测试控制器是否为对象分配变量,但失败了。这些都是控制器测试,有许多方面我非常感谢您的帮助,即Ruby on rails 如何最好地测试控制器变量分配的多个关联?,ruby-on-rails,testing,rspec,Ruby On Rails,Testing,Rspec,我正在尝试测试控制器是否为对象分配变量,但失败了。这些都是控制器测试,有许多方面我非常感谢您的帮助,即 我应该在这里以这种方式写这样的测试吗 如果是这样的话,我怎样才能让它工作呢 代码如下: Company.rb class Company < ApplicationRecord belongs_to :user has_many :employees, inverse_of: :company has_many :quotes, in
class Company < ApplicationRecord
belongs_to :user
has_many :employees, inverse_of: :company
has_many :quotes, inverse_of: :company
end
quotess“U controller.rb”show
我为以下车型的eahc建立了工厂女孩工厂:
公司.rb
FactoryGirl.define do
factory :company do
sequence(:co_name) { |n| "Acme Co #{n}" }
co_number "06488522"
postcode "al1 1aa"
industry :financial_services
factory :company2 do
end
factory :company3 do
end
end
end
Quotes.rb
FactoryGirl.define do
factory :quote do
lives_overseas true
payment_frequency :monthly
factory :quote2 do
end
factory :quote3 do
end
end
end
Employees.rb
FactoryGirl.define do
factory :employee1, class: Employee do
first_name "MyString"
last_name "MyString"
email "test@test.com"
gender "MyString"
date_of_birth "2000-06-20"
salary 10000
factory :employee2 do
end
factory :employee3 do
end
end
end
我试图为Quote#show编写控制器测试,并测试三个对象的分配,即:<代码>@company,@quote
和@employees
到相关变量。代码如下:
报价单\u控制器\u规格rb
require 'rails_helper'
RSpec.describe QuotesController, type: :controller do
let(:user) {FactoryGirl.create(:user) }
let(:company) { FactoryGirl.create(:company, user: user) }
let(:employee1) { FactoryGirl.create(:employee1, company: company) }
let(:employee2) { FactoryGirl.create(:employee2, company: company) }
let(:employee3) { FactoryGirl.create(:employee3, company: company) }
let(:quote) { FactoryGirl.create(:quote, company: company) }
describe "GET #show" do
it "returns http success" do
get :show, params: { company_id: company.id, id: quote.id, , employee_id: employee1.id }
expect(response).to have_http_status(:success)
end
it "assigns requested quote to @quote" do
get :show, params: { company_id: company.id, id: quote.id, employee1.id: employee1.id } #, employee_id: employee1.id
expect(assigns(:quote)).to eq(quote) # passes fine
expect(assigns(:company)).to eq(company) # passes fine
expect(assigns(:employee1)).to eq(employee1) # fails
end
end
end
我得到一个错误,如下所示:
失败:
1) QuotesController GET #show assigns requested quote to @quote
Failure/Error: expect(assigns(:employee1)).to eq(employee1)
expected: #<Employee id: 1, first_name: "MyString", last_name: "MyString", email: "test@test.com", gender: "m",...alary: 10000, company_id: 178, created_at: "2017-07-01 11:21:27", updated_at: "2017-07-01 11:21:27">
got: nil
(compared using ==)
# ./spec/controllers/quotes_controller_spec.rb:28:in `block (3 levels) in <top (required)>'
我觉得有一些核心的东西我在这里没有得到
Quotes#show
中@employees
变量的分配,而不是仅分配一条员工记录,这正是我试图做的,但失败了公司中创建并在报价中呈现的其他模型对象(公司、报价和员工)
感谢您的帮助和指导。下午的阅读和谷歌搜索让我仍然不知所措,不知如何才能在这里找到正确的测试策略以及正确的语法使其正常工作。顺便说一句,应用程序中的所有工作都很好,我只想能够测试这个Quotes#show方法中正确对象的赋值。谢谢。这个问题第二部分的答案是。在我的代码上下文中,测试集合的分配是:
expect(assigns(:employees)).to include(employee1)
或
仍在寻求对该问题第1部分和第3部分的反馈
感谢初始错误看起来很简单——employee对象上不存在初始字段,因此无法设置值。我猜您的数据库中没有相应的字段。感谢@dbugger,我在那里犯的愚蠢错误,已更正,现在是关于employee factory对象未分配给变量的新故障。答案已在上面更新。您分配了
@employee1
,但测试了@employee1
。难怪这个检查失败了。我看到@employees是在Quotes#show中定义的,因此我需要为一个集合分配一些employeefactory对象(一个以id为键的散列,以散列中的attrs为值?),然后我需要检查同一个集合是否分配给@employees?
FactoryGirl.define do
factory :employee1, class: Employee do
first_name "MyString"
last_name "MyString"
email "test@test.com"
gender "MyString"
date_of_birth "2000-06-20"
salary 10000
factory :employee2 do
end
factory :employee3 do
end
end
end
require 'rails_helper'
RSpec.describe QuotesController, type: :controller do
let(:user) {FactoryGirl.create(:user) }
let(:company) { FactoryGirl.create(:company, user: user) }
let(:employee1) { FactoryGirl.create(:employee1, company: company) }
let(:employee2) { FactoryGirl.create(:employee2, company: company) }
let(:employee3) { FactoryGirl.create(:employee3, company: company) }
let(:quote) { FactoryGirl.create(:quote, company: company) }
describe "GET #show" do
it "returns http success" do
get :show, params: { company_id: company.id, id: quote.id, , employee_id: employee1.id }
expect(response).to have_http_status(:success)
end
it "assigns requested quote to @quote" do
get :show, params: { company_id: company.id, id: quote.id, employee1.id: employee1.id } #, employee_id: employee1.id
expect(assigns(:quote)).to eq(quote) # passes fine
expect(assigns(:company)).to eq(company) # passes fine
expect(assigns(:employee1)).to eq(employee1) # fails
end
end
end
1) QuotesController GET #show assigns requested quote to @quote
Failure/Error: expect(assigns(:employee1)).to eq(employee1)
expected: #<Employee id: 1, first_name: "MyString", last_name: "MyString", email: "test@test.com", gender: "m",...alary: 10000, company_id: 178, created_at: "2017-07-01 11:21:27", updated_at: "2017-07-01 11:21:27">
got: nil
(compared using ==)
# ./spec/controllers/quotes_controller_spec.rb:28:in `block (3 levels) in <top (required)>'
<ActionController::Parameters {"controller"=>"quotes", "action"=>"show", "company_id"=>"109", "id"=>"109", "format"=>"#<Employee::ActiveRecord_AssociationRelation:0x007fc2694a07f8>"} permitted: false>
expect(assigns(:employees)).to include(employee1)
expect(assigns(:employees)).to eq([employee1])