在控制器规格(rspec)中测试设计和cancan

时间:2011-05-12 04:34:43

标签: ruby-on-rails rspec devise functional-testing cancan

现在我的CanCan和Devise工作得很好,我需要添加到我的测试中。

我应该期望最终测试次数增加一倍,或许更多?我需要将所有内容作为“访客”用户进行测试,然后作为用户和管理员进行测试。

使用rspec你会如何解决这个问题?

describe "GET edit" do
    login_admin
    it "assigns the requested forum_topic as @forum_topic" do
      ForumTopic.stub(:find).with("37") { mock_forum_topic }
      get :edit, :id => "37"
      response.should redirect_to( new_user_session_path )
    end

    it "assigns the requested forum_topic as @forum_topic" do
      ForumTopic.stub(:find).with("37") { mock_forum_topic }
      get :edit, :id => "37"
      assigns(:forum_topic).should be(mock_forum_topic)
    end
end

帮助程序模块

  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in Factory.create(:admin)
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end

1 个答案:

答案 0 :(得分:2)

测试CanCan时通常会做的是测试能力文件本身。

例如,如果你在你的应用程序中测试它,你应该无法查看某个论坛,除非签名你可以这样测试:

@user = Factory.create(:user)
@forum = Factory.create(:forum)

describe "User ability" do
  it "Should be able to view forums" do
    @ability = Ability.new(@user)
    @ability.should be_able_to(:show, @forum)
  end
end

describe "nil ability" do
  it "Should be not be able to view forums if not signed in" do
    @ability = Ability.new(nil)
    @ability.should_not be_able_to(:show, @forum)
  end
end

这只是一个例子。

您可以在https://github.com/ryanb/cancan/wiki/Testing-Abilities

中详细了解相关信息

最后测试设计我只是与capybara进行集成测试,并使用admin和user登录。