0

以下は私のレールコントローラーです:

class MyController < ApplicationController
  def index
    @client = (current_company.clients.size || 0) >= current_company.subscription.clients    # it returns true or false
    begin
      @obj = Class.all
      respond_to do |format|
        format.html # index.html.erb
      end
    rescue
    end
  end
end

以下は、(spec/controller) の下にある私の rspec コードです。

require 'spec_helper'

describe MyController do

  describe "GET index" do

    it "populates an array of data" do
       current_company = mock_model(CompaniesUser)
       clients = mock_model(Client)
       get :index

       .
       .
    end

  end

end

実行後、次のエラーが表示されます。

Failures:

  1) MyController GET index populates an array of clients
     Failure/Error: get :index
       Double "Company_1" received unexpected message :clients with (no args)
     # ./app/controllers/my_controller.rb:20:in `index'
     # ./spec/controllers/my_controller_spec.rb:28:in `block (3 levels) in <top (required)>'

current_compnay.clients.sizeでは、rspecコントローラーでこの関連付けを行う方法は? current_company.clients.size仕様からコントローラのインデックス メソッドで値を取得できないため、エラーが発生します。

4

3 に答える 3

0

あなたの質問を正しく理解しているかどうかわかりません。このようなものをお探しですか?

it "populates an array of data" do
   controller.stub(:current_company) {
     mock_model(CompaniesUser, clients: [mock_model(Client)]) 
   }
   get :index
   # ...

コメント後のいくつかの変更:

let(:client) { mock_model(Client, :id => 1)}
let(:company) { mock_model(Company, :id => 1, :clients => [client])}
before { controller.stub(:current_company).and_return(company) }
it "populates an array of data" do
   get :index
   # ...
于 2013-10-16T13:03:14.460 に答える
0

免責事項: エラーを飲み込まないでください!

そのbegin rescue end部分は何のためですか?削除してください。テンプレートをレンダリングするときに発生するエラーを隠します!

@obj = Class.allその疑似コードは何ですか?疑似コードを追加する場合は、それについてメモしてください。

コントローラーにそのような複雑なロジックがある場合は、それをそのクラスのメソッドに移動することをお勧めします。そのため、の呼び出しまたはビジネス ロジックに名前を付ける必要(current_company.clients.size || 0) >= current_company.subscription.clientsがあるものにリファクタリングされる可能性があります。current_company.has_not_enough_clients

次に、そのメソッドをスタブ化するか、その特定のモデルに対してのみテストダブルを使用します。

于 2013-10-16T13:00:06.060 に答える
0

問題は次のように解決されました。

コントローラー仕様の開始時:

let(:current_company) {mock_model(CompanyUser, :id => 1, clients: [mock_model(Client)])}

「current_company.clients.size」が「1」を与えるので、これにアクセスできます

于 2013-10-17T06:32:04.733 に答える