0

我对使用 Rails 进行测试非常陌生,并且似乎让自己迷失在测试的世界中。我目前正在测试我的仪表板控制器,当我从控制器中删除load_and_authorize_resource行时,一切都通过了。我正在使用 cancan 进行授权。

仪表板控制器.rb

def update
@dashboard = Dashboard.find(params[:id])

respond_to do |format|
  if @dashboard.update_attributes(params[:dashboard])
    format.html { redirect_to dashboards_path, notice: 'dashboard was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @dashboard.errors, status: :unprocessable_entity }
  end
end
end

dashboard_controller_spec.rb

require 'spec_helper'

describe DashboardsController do

  login_user
  before :each do 
    @dashboard = create(:dashboard, dashboard_name: "My Own Dashboard", id: 1)
  end

  describe "GET #index" do

    it "should have a current_user" do 
      subject.current_user.should_not be_nil
    end

    it "renders the :index view" do
      get :index
      response.should render_template :index
    end

    it "Creates new dashboard" do 
      get :new
      response.should render_template :new
    end

  end

  describe "Get #edit" do 

    it "assigns dashboard to @dashboard" do 
      get :edit, id: @dashboard
      assigns(:dashboard).should == @dashboard
    end

    it "renders the :edit template" do 
      get :edit, id: @dashboard
      response.should render_template :edit
    end

  end


end

我从控制台收到的错误

 1) DashboardsController Get #edit renders the :edit template
 Failure/Error: response.should render_template :edit
   expecting <"edit"> but rendering with <"">
 # ./spec/controllers/dashboard_controller_spec.rb:37:in `block (3 levels) in <top (required)>'

无论如何绕过这个错误而不删除我的dashboard_controller中的load_and_authorize_resource?

4

1 回答 1

0

当涉及到 Devise 时测试控制器是一件非常棘手的事情。你没有提供你的 login_user 代码,但我猜它并没有涵盖所有的基础。根据官方的 Devise 文档,您需要与守望者、Devise 的实用方法等一起提供帮助。我会在这里重复一遍,但它会更长一些,您也可以访问源代码。最相关的部分是:

如果您使用任何设计的实用程序方法,控制器规格将无法开箱即用。

从 rspec-rails-2.0.0 和 devise-1.1 开始,将设计放入规范的最佳方法是将以下内容添加到 spec_helper...

然后添加他们的示例 controller_macros.rb 并调整一些其他的东西,你应该很高兴。但是,请注意,测试您的控制器规格与测试请求规格不同,您可能会在该解决方案无法解决的不同场景中遇到挂断(请参阅我自己的一些痛苦和发现,网址为https://stackoverflow.com/ a/13275366/9344)。

于 2012-11-28T10:35:42.893 回答