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

我正在尝试测试控制器是否为对象分配变量,但失败了。这些都是控制器测试,有许多方面我非常感谢您的帮助,即

  • 我应该在这里以这种方式写这样的测试吗
  • 如果是这样的话,我怎样才能让它工作呢
  • 代码如下:

    Company.rb

    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])