以下是我的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
而提供错误
答案 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”