2008-09-15 92 views
17

我使用Bort創建了一個學習應用程序,該應用程序是一個包含Restful Authentication和RSpec的基本應用程序。我已經啓動並運行了,並添加了一個新對象,要求用戶在可以執行任何操作之前先登錄(控制器中的before_filter :login_required)。 [編輯:我還應該提到,新用戶has_many和只有用戶應該能夠看到它]Rails,Restful Authentication&RSpec - 如何測試需要認證的新模型

我已經創建了新的模型/控制器使用Rspec的發電機已創建了一些默認試驗。如果沒有before_filter,它們都會通過,但如果有一些失敗,應該會發生,一旦before_filter就位。

如何讓生成的測試運行,就好像有/不是已登錄的用戶一樣?我是否需要一整批匹配沒有登錄 - 重定向測試?我認爲這是一種嘲弄或夾具技術,但我是RSpec的新手而且有點漂亮。良好的RSpec教程鏈接也將不勝感激。

回答

7

我有一個非常類似的設置,下面是我目前用來測試這個東西的代碼。在每個describe S的我把:

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 
4

我發現了幾個答案,我自己的問題。基本上,我需要了解如何從restful_authentication中嘲笑用戶,以便自動生成的rspec控制器測試可以通過,即使我已經添加了before_filter: login_required

下面是一些我剛發現的資源:

RSpec: It Should Behave Like

rspec, restful_authentication, and login_required

using restful_authentication current_user inside controller specs

DRYing up your CRUD controller RSpecs

1

嘲笑用戶正在登錄,我攻入控制器手動設置@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 
7

當不測試的認證,但測試需要用戶被認證本人通常短柱過濾方法的控制器:

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

上面示例工作,其中我的before_filter被設置爲在認證方法:

before_filter :authenticate 

和我的應用程序中的身份驗證使用HTTP基本身份驗證,但它確實可以是任何其他身份驗證機制。

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

我認爲這是一個非常簡單的測試方法。

+0

最甜蜜的一個! – AnkitG 2013-10-10 15:16:05