1

我想编写一个测试以确保“专家”用户可以创建文章,而“基本”用户不能。例如,基本用户不能去这里:"http://0.0.0.0:3000/articles/new". 下面是我的文章控制器的缩短版本,然后是文章测试。控制器可以工作,但我希望通过测试来证明这一点。我不确定在“代码在此处”的位置放什么。谢谢。

文章控制器:

class ArticlesController < ApplicationController
  load_and_authorize_resource

      # GET /articles/new
      # GET /articles/new.json
      def new
        puts "in articles new"
        @article = Article.new

        respond_to do |format|
          format.html # new.html.erb
          format.json { render json: @article }
        end
      end
    end

文章控制器规格:

    describe ArticlesController do

  before (:each) do
    @user = FactoryGirl.create(:user)
    @user.role = "basic"
    sign_in @user
  end

  describe "create article" do
    it "should not create new article" do
      #code goes here
    end
  end
end
4

3 回答 3

2

根据控制器的规格测试 CanCan 能力很快就会破坏您的规格。

我更喜欢使用cancan/matchers在spec/models/ability_spec.rb中测试能力

于 2013-08-20T04:45:15.180 回答
0

在您的规范文件中,您可以这样做:

describe "create article" do
  it "should not create new article" do
    get :new
    expect(response).not_to render_template("new")
  end
end

在 cancan 的文档中,请参见https://github.com/ryanb/cancan/wiki/Testing-Abilities,您可以获取详细信息。

于 2013-08-20T04:41:23.147 回答
0

与其测试不应该发生的事情,不如考虑对应该发生的事情进行更简单的测试:

it "should return 401" do
  get :new
  expect(response.status).to eq(401)
end
于 2014-12-02T21:20:58.350 回答