2013-02-08 151 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