2013-02-08 180 views
0

我寫了大部分Rspec規範,但我面臨着一個重要問題。我在我所有的路由上設置了一個路由約束(這本身可能是有爭議的)。只有允許IP地址(存儲在單獨的IpAddress模型中)的管理員才能訪問我的應用程序中的某些區域。長話短說,我想模擬或存根我的約束模型,以便我可以自由地訪問我的規範中的所有內容。Rspec忽略路由約束

我的約束是這樣的:

class IpAddressConstraint 
    def initialize 
    @ips = IpAddress.select('number') 
    end 

    def matches?(request) 
    if @ips.find_by_number(request.remote_ip).present? || Rails.env.test? #<- temporary solution 
     true 
    else 
     if @current_backend_user.present? 
     backend_user_sign_out 
     else 
     raise ActionController::RoutingError.new('Not Found') 
     end 
    end 
    end 
end 

MyApp::Application.routes.draw do 
    constraints IpConstraint.new do 
    #all routes 
    end 
end 

什麼是我可以測試Rspec的該路由約束的最佳方式?目前我已經添加了一個條件,如果我在我的測試環境中,我可以完全跳過這些約束。如果我能以某種方式模擬這個約束,那會更好。

+0

將127.0.0.1/32添加到允許的IPS列表中?假設你正在使用像水豚一樣的東西? – Doon 2013-02-08 15:34:47

+0

我有一個IP的獨立模型,但只能通過登錄訪問。如果我可以編寫一個助手,我可以創建一個新的Ip_address.number(在我的情況下爲127.0.0.1),這將是很好的。儘管有這樣一個嚴格的限制,但這可能是一個糟糕的設計決定。 – 2013-02-08 15:43:19

+0

你有一個稱爲IpAddress的IP模型。所有你需要做的就是像'IpAddress.create(number:'127.0.0.1')'在任何通過路由的規範之前。您不需要通過其控制器/等創建該對象/記錄。 – Doon 2013-02-08 15:51:47

回答

1

什麼是這樣的:

describe "Some Feature" do 

context "from allowed ip" do 
    before(:each) {IpAddress.create(number: '127.0.0.1')} 

    it "should allow access to foo" do 
    ..... 
    end 

    .... 
end 

context "from non allowed ip" do 
    it "shouldn't allow access to foo" do 
    ..... 
    end 
end 

然後,你可以提取IP地址創建要麼一個輔助模塊,或者特別是如果你需要做更復雜的設置功能。如果你總是希望它在那裏,你可以將它添加到你的spec_helper文件配置塊中,以便在每個/每個規範之前運行,但是那麼你將很難測試它是否成功地阻止未經授權的ips。

+0

此解決方案看起來非常簡單。其實,我認爲我已經嘗試過,但仍遇到一些問題。可能是一個強硬的類型,我會在星期一再次檢查它(我的應用程序只在工作中)。如果這個解決方案有效,我會接受你的答案。我真的不喜歡我的臨時解決方案,只是在測試環境中跳過路由約束。 – 2013-02-08 18:53:26

+0

我不明白爲什麼它不應該工作(着名的遺言)。但是,如果你遇到問題,包括他們,也許我們可以提供幫助。 – Doon 2013-02-08 19:40:58

+0

讓我們希望你的權利。如果我遇到任何問題,我會發布我的錯誤日誌。 – 2013-02-08 19:55:44