如何从rspec控制器中为控制器中的实例变量赋值或传递值?

时间:2013-10-16 10:26:27

标签: ruby-on-rails ruby-on-rails-3 rspec associations

以下是我的rails控制器:

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

那么如何在rspec控制器中进行关于current_compnay.clients.size的关联?它由于未从规范

中获得控制器索引方法中的值current_company.clients.size而提供错误

3 个答案:

答案 0 :(得分:0)

免责声明:请不要误传!

begin rescue end部分内容是什么?请继续删除。它隐藏了渲染模板时发生的任何错误!

那个@obj = Class.all是什么伪代码?如果你添加伪代码,请记下它!

如果您的控制器中有如此复杂的逻辑,那么将它移动到该类的方法中是个好主意。因此(current_company.clients.size || 0) >= current_company.subscription.clients可能会被重构为current_company.has_not_enough_clients或您的业务逻辑应该命名的任何内容。

然后继续存根该方法或仅​​对该特定模型使用test-double。

答案 1 :(得分: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
   # ...

答案 2 :(得分:0)

问题解决如下:

在控制器规范开始时:

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

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