ruby-on-rails - 如何使用 RSpec 测试路由约束

标签 ruby-on-rails routing ruby-on-rails-3 rspec constraints

鉴于数据库中的几个城市:

City.first.attributes => {:id => 1, :name => 'nyc'}
City.last.attributes =>  {:id => 2, :name => 'boston'}

和一条路线:
match '/:city/*dest' => 'cities#do_something', :constraints => {:city => /#{City.all.map{|c| c.name}.join('|'}/}

(因此约束应评估为:/nyc|boston/)

还有一个规范:
it "recognizes and generates a route for city specific paths" do
  { :put => '/bad-city/some/path' }.should route_to({:controller => "cities", :action => "do_something", :dest => 'some/path', :city => 'bad-city'})
end

我预计会失败。但它过去了。

同样地:
it "doesn't route bad city names" do
  { :put => '/some-bad-city/some/path' }.should_not be_routable
end

在这里,我希望它通过,但它失败了。

规范中似乎忽略了约束,因为匹配的城市与坏城市的行为相同。

这是一个已知问题,还是我遗漏了一些我需要做的事情?

最佳答案

这种方法有效:
在routes.rb

match '/:city/*destination' => 'cities#myaction', :constraints => {:city => /#{City.all.map{|c|c.slug}.join('|')}/}

在规范中:
describe "routing" do
  before(:each) do
    @mock_city = mock_model(City, :id => 42, :slug => 'some-city')
    City.stub!(:find_by_slug => @mock_city, :all => [@mock_city])
    MyApp::Application.reload_routes!
  end

  it "recognizes and generates a route for city specific paths" do
    { :get => '/some-city/some/path' }.should route_to({:controller => "cities", :action => "myaction", :destination => 'some/path', :city => 'some-city'})
  end

  it "rejects city paths for cities that don't exist in the DB" do
    { :get => '/some-bad-city/some/path' }.should_not be_routable
  end
end

最后,我添加了一个观察者来在城市表发生变化时重新加载路线。

关于ruby-on-rails - 如何使用 RSpec 测试路由约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856322/

相关文章:

ruby-on-rails - Rspec expect( ) 与 expect { }

ruby-on-rails - 检索 Gemfile 中指定的 Ruby 版本的编程方式?

ruby-on-rails - 我如何将 gemspec 依赖声明为 >= 3.1 但小于 < 4.0

symfony - 使用 Silex 自定义路由配置

ruby-on-rails - 带有label_tag的check_box_tag点击操作

ruby - Rails 3 在查询中得到错误的计数

ruby-on-rails - GoDaddy 的通配符域名

linux - 通过 linux 路由表 Ping 不工作[或]这是怎么回事?

ruby-on-rails - 如果即使对于开源项目,rails 项目的任何源代码也应该被隐藏怎么办?

ruby-on-rails - Link_to_remote 与嵌套路由