2017-06-30 5 views
0

私は、belongs_toオブジェクトの変数割り当てのためにコントローラをテストしようとしていません。これらはコントローラテストであり、いくつかの助けを借りて本当に感謝できるいくつかの領域があります。すなわち、has_many関連のコントローラ変数割り当てをテストするにはどうすればよいですか?

  1. ここで、このようなテストをこのように書くべきでしょうか。
  2. もしそうなら、どうすればそれを動かすことができますか?以下のよう

コード:

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変数に収集し、その割り当ての存在ではなくテストする必要があるファクトリー・ガール内の関連付けを宣言する何とか必要

    1. それは私が何をしようとしているのか、失敗しているのか、上記のことです。

    2. は、私はそれはおそらく、私は他のモデルオブジェクト(会社、引用及び従業員)Companies#createで作成され、Quotes#showでレンダリングでテストしていますので、存在するはず「分離線」交差していたか否かが不明です。

    ご了承ください。午後の読書とグーグルでは、ここで私のテスト戦略をどのように得ることができ、それが正しく機能するための構文が正しいかについて、私はまだ迷っています。ちなみに、アプリケーションのすべての作品はうまく、私はちょうどこの引用#ショーメソッドで正しいオブジェクトの割り当てをテストできるようにしたいと思います。ありがとう。

  • +1

    初期誤差は簡単な問題のように見える - その値を設定することができませんので、**初期**フィールドには、従業員オブジェクトに存在しません。私の推測では、データベースには対応するフィールドがないということです。 – dbugger

    +0

    ありがとう@dbugger、私の愚かな間違いが修正されました。従業員ファクトリオブジェクトが変数に割り当てられていないという新たな失敗に直面しました。回答は上記のとおりです。 – jbk

    +0

    '@ employees'を割り当てますが、' @ employee1'をテストします。このチェックが失敗するのは不思議ではない。 –

    答えて

    0

    この質問のパート2への回答は、部品1と、この質問の3に

    expect(assigns(:employees)).to include(employee1) 
    

    または

    expect(assigns(:employees)).to eq([employee1]) 
    

    フィードバックはまだ模索:私のコードのコンテキストで、コレクションの割り当てをテストすることのいずれかでした。

    おかげ

    関連する問題