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

以下是我在(规范/控制器)下的 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

免责声明:请不要吞下错误!

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

不确定我是否正确理解了您的问题。你在寻找这样的东西吗?

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

问题解决如下:

在控制器规范开始时:

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

现在您可以访问它,因为“current_company.clients.size”给出“1”

于 2013-10-17T06:32:04.733 回答