0

我编写了大部分 Rspec 规范,但我面临一个重要问题。我已经在我的所有路由上设置了路由约束(这本身可能是有争议的)。只有允许 Ip 地址(存储在单独的 IpAddress 模型中)的管理员才能访问我的应用程序中的某些区域。

长话短说,我想模拟或存根我的约束模型,以便我可以自由地访问我的规范内的所有内容。

我的约束如下所示:

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 中测试此路由约束的最佳方法是什么?目前我已经添加了一个条件,所以如果我在我的测试环境中,我可以完全跳过这些约束。如果我能以某种方式模拟这种约束会更好。

4

1 回答 1

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 文件配置块中以在每个/每个规范之前运行,但是您将很难测试它是否成功阻止了非授权 ip。

于 2013-02-08T16:08:12.757 回答