2017-07-30 56 views
0

我有一个控制器动作欲测试:RSpec的摆幅 - 存根控制器可变

LOG = ApiRequest::Resource::Login 

def create 
    @response = LOG.new(current_user, params: params).create 
    return if request_failed? 
    ... 
end 

def request_failed? 
    if @response.is_a? Hash 
     false 
    else 
     error = @response 
     redirect_to new_login_path, alert: error 
     true 
    end 
    end 

LOG.new(current_user, params: params).create是外部API调用正常返回任一散列或与该错误的字符串。我想测试控制器动作而不触发呼叫,如强制@response = {},并检查它是否不重定向,并强制@response = ""应触发重定向。

it 'redirects if fails the request' do 
    post :create 
    expect(response).to redirect_to new_login_path 
    expect(flash[:alert]).not_to be nil 
end 

如何存根实例变量?

回答

2

我会磕碰LOG实例进行测试,这样的:

let(:log_instance) { instance_double(LOG) } 

before do 
    allow(LOG).to receive(:new).and_return(log_instance) 
    allow(log_instance).to receive(:create).and_return({}) 
end 
+0

你必须使用ControllerName :: LOG访问不断,除了它的工作! – YoloSnake