Rails,Restful Authentication&RSpec – 如何测试需要身份validation的新模型

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

我使用Rspec的生成器创建了新的模型/控制器,这些生成器创建了许多默认测试。 如果没有before_filter那么它们都会通过,但是一旦before_filter到位,它们会失败,正如预期的那样。

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

我有一个非常类似的设置,下面是我正在使用的代码来测试这些东西。 在每个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 

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

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

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

 before_filter :authenticate 

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

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

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

我找到了一些自己问题的答案。 基本上,我需要了解如何从restful_authentication模拟用户,以便即使我添加了before_filter: login_required ,自动生成的rspec控制器测试也可以通过。

以下是我刚发现的一些资源:

RSpec:它应该像

rspec,restful_authentication和login_required

在控制器规范中使用restful_authentication current_user

干掉你的CRUD控制器RSpec

要模拟正在登录的用户,我会入侵控制器以手动设置@current_user

 module AuthHelper protected def login_as(model, id_or_attributes = {}) attributes = id_or_attributes.is_a?(Fixnum) ? {:id => id} : id_or_attributes @current_user = stub_model(model, attributes) target = controller rescue template target.instance_variable_set '@current_user', @current_user if block_given? yield target.instance_variable_set '@current_user', nil end return @current_user end def login_as_user(id_or_attributes = {}, &block) login_as(User, id_or_attributes, &block) end end