私は、belongs_toオブジェクトの変数割り当てのためにコントローラをテストしようとしていません。これらはコントローラテストであり、いくつかの助けを借りて本当に感謝できるいくつかの領域があります。すなわち、has_many関連のコントローラ変数割り当てをテストするにはどうすればよいですか?
- ここで、このようなテストをこのように書くべきでしょうか。
- もしそうなら、どうすればそれを動かすことができますか?以下のよう
コード:
Company.rbは
class Company < ApplicationRecord
belongs_to :user
has_many :employees, inverse_of: :company
has_many :quotes, inverse_of: :company
end
Quote.rb
class Quote < ApplicationRecord
belongs_to :company
end
Employee.rb
class Employee < ApplicationRecord
belongs_to :company
end
当社が持っています通常のCRUDを持つコントローラー、見積もりにはShowとIndexのコントローラーがあり、従業員にコントローラーはありません。 Companies#createは3つのオブジェクトすべてを作成し、redirect_to
はQuotes#showに3つのモデルすべてからさまざまなattrsをレンダリングします。
companies_controller.rbの#create
def create
@company = current_user.companies.new(company_params)
if @company.save
@quote = @company.quotes.last
@employees = @company.employees.all
redirect_to company_quote_url(@company, @quote, @employees), notice: 'Quote request created'
else
render :new
end
end
私はモデルのeahc用に設定ファクトリー・ガールの工場を持っている#show
def show
@company = Company.find(params[:company_id])
@quote = @company.quotes.find(params[:id])
@employees = @company.employees.all
end
quotess_controller.rb:
Companies.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 "[email protected]"
gender "MyString"
date_of_birth "2000-06-20"
salary 10000
factory :employee2 do
end
factory :employee3 do
end
end
end
そして、私は引用#ショーのためのコントローラのテストを記述すると、3つのオブジェクト、すなわちの割り当てをテストしようとしています。; @company
,@quote
& @employees
を相対変数に置き換えます。これまでのコード:
quotes_controller_specRB
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: "[email protected]", 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)>'
私はアプリケーションを実行し、当社#は、これらを作成した後、引用#ショーテンプレートにparams.inspect
を使うのparamsですそれは渡されます:
私はgettではないいくつかのコアな事があるように感じるここにいる。私は
私のテストは何とかちょうど1従業員レコードの割り当て、Quotes#show
に@employees
変数に収集し、その割り当ての存在ではなくテストする必要があるファクトリー・ガール内の関連付けを宣言する何とか必要
それは私が何をしようとしているのか、失敗しているのか、上記のことです。
は、私はそれはおそらく、私は他のモデルオブジェクト(会社、引用及び従業員)
Companies#create
で作成され、Quotes#show
でレンダリングでテストしていますので、存在するはず「分離線」交差していたか否かが不明です。
ご了承ください。午後の読書とグーグルでは、ここで私のテスト戦略をどのように得ることができ、それが正しく機能するための構文が正しいかについて、私はまだ迷っています。ちなみに、アプリケーションのすべての作品はうまく、私はちょうどこの引用#ショーメソッドで正しいオブジェクトの割り当てをテストできるようにしたいと思います。ありがとう。
初期誤差は簡単な問題のように見える - その値を設定することができませんので、**初期**フィールドには、従業員オブジェクトに存在しません。私の推測では、データベースには対応するフィールドがないということです。 – dbugger
ありがとう@dbugger、私の愚かな間違いが修正されました。従業員ファクトリオブジェクトが変数に割り当てられていないという新たな失敗に直面しました。回答は上記のとおりです。 – jbk
'@ employees'を割り当てますが、' @ employee1'をテストします。このチェックが失敗するのは不思議ではない。 –