当前位置:  开发笔记 > 前端 > 正文

Rails,Restful Authentication&RSpec - 如何测试需要身份验证的新模型

如何解决《Rails,RestfulAuthentication&RSpec-如何测试需要身份验证的新模型》经验,为你挑选了2个好方法。

我使用Bort创建了一个学习应用程序,这是一个包含Restful Authentication和RSpec的基础应用程序.我已经启动并运行并添加了一个新对象,要求用户在他们可以做任何事情之前登录(before_filter :login_required在控制器中).[编辑:我还应该提到has_many新类的用户,只有用户才能看到它.]

我使用Rspec的生成器创建了新的模型/控制器,这些生成器创建了许多默认测试.如果没有,那么它们都会通过,before_filter但是一旦before_filter到位,它们就会出现故障.

如何让生成的测试运行,就好像有/不是登录用户?我是否需要未登录的整批匹配 - 重定向测试?我认为它是某种嘲弄或夹具技术,但我是RSpec的新手并且有点漂泊.良好的RSpec教程链接也将不胜感激.



1> TALlama..:

我有一个非常相似的设置,下面是我正在使用的代码来测试这些东西.在describe我输入的每一个中:

it_should_behave_like "login-required object"
def attempt_access; do_post; end

如果您只需要登录,或者

it_should_behave_like "ownership-required object"
def login_as_object_owner; login_as @product.user; end
def attempt_access; do_put; end
def successful_ownership_access
  response.should redirect_to(product_url(@product))
end

如果您需要所有权.显然,辅助方法每转一圈都会改变(非常少),但这对你来说大部分工作都是如此.这是在我的spec_helper.rb中

shared_examples_for "login-required object" do
  it "should not be able to access this without logging in" do
    attempt_access

    response.should_not be_success
    respond_to do |format|
      format.html { redirect_to(login_url) }
      format.xml { response.status_code.should == 401 }
    end
  end
end

shared_examples_for "ownership-required object" do
  it_should_behave_like "login-required object"

  it "should not be able to access this without owning it" do
    attempt_access

    response.should_not be_success
    respond_to do |format|
      format.html { response.should be_redirect }
      format.xml { response.status_code.should == 401 }
    end
  end

  it "should be able to access this if you own it" do
    login_as_object_owner
    attempt_access

    if respond_to?(:successful_ownership_access)
      successful_ownership_access
    else
      response.should be_success
    end
  end
end



2> Marcos Olive..:

当不测试身份验证但测试需要用户进行身份验证的控制器时,我通常会使用过滤器方法:

before(:each) do
  controller.stub!(:authenticate).and_return(true)
end

上面的示例适用于我的before_filter设置为authenticate方法的地方:

before_filter :authenticate

我的应用程序中的身份验证使用HTTP基本身份验证,但它确实可以是任何其他身份验证机制.

private
def authenticate
  authenticate_or_request_with_http_basic do |user,password|
    user == USER_NAME && password == PASSWORD
  end
end

我认为这是一种非常直接的测试方式.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有