【问题标题】:What is Shoulda's route matcher for?Shoulda 的路由匹配器是做什么用的?
【发布时间】:2014-07-01 03:19:26
【问题描述】:

根据the shoulda page

动作控制器匹配器

- route 测试您的路线。

我只是不确定它的用途。尤其是在一个独立的 controller 单元规范中。为什么这在控制器规范中?有什么相关性?这不应该只是在它自己的路线规范中吗?然而在应该页面上,这个匹配器被列为 ActionController Matcher...

或者是 ActionController 负责路由所以使用这个匹配器?

如果我应该在我的控制器规范中使用这个匹配器,我可以举一个例子来说明我应该如何使用它吗?

【问题讨论】:

  • 您正在更改规范的主题 - 如果您这样做,大多数 shoulda-matchers 的控制器匹配器都会严重损坏。 github.com/thoughtbot/shoulda-matchers/issues/90
  • 主题应该是什么。控制器?你能解释一下它的实际作用吗?
  • 主题应该保留为默认值,对于控制器规范来说就是控制器本身。
  • 我收到Failure/Error: controller.should route(:get, '/posts/1').to(action: :show, id: 1) NoMethodError: undefined method 'should' for #<FoldersController:0x007fbed9516630>
  • 完全离开这个话题。 it { should route(whatever).to(whatever) }

标签: ruby-on-rails ruby rspec rspec-rails shoulda


【解决方案1】:

为什么 shoulda-matchers 的 route 匹配器是 ActionController 匹配器?

应该匹配器的 route 匹配器是 ActionController 匹配器,因为它的主题可以是控制器。您可以自己指定:controller,这种情况下主题无关紧要:

describe 'Routing' do
  it { is_expected.to route(:get, '/posts/1').to(controller: :posts, action: :show, id: 1) }
end

或者你可以让它为你推断:controller

describe PostsController do
  it { is_expected.to route(:get, '/posts/1').to(action: :show, id: 1) }
end

在后一种情况下,route 对主题 (PostsController) 所做的所有操作都是在其上调用 .controller_name。但它使用控制器,所以它是一个ActionController 匹配器。

route 是用于控制器规范还是路由规范?

路由是与控制器完全分离的 Rails 层,因此 RSpec 具有单独的控制器和路由规范,这就是我编写它们的方式。但我确实使用了 shoulda-matchers,而且我不想输入 controller:,所以我将我的路由规范控制器的主题作为上面的第二个示例。

如果您以这种方式编写路由规范,则控制器的主题和路由规范是相同的,因此您可能会发现将路由示例放在控制器规范文件中很方便。当您添加或删除控制器操作时,这将使您的控制器和路由规范更容易保持同步。我不会反对这一点。不过,我要记住,控制器并不是路由规范的真正主题。它只是节省您的打字时间。

The shoulda-matchers rdoc 暗示了这两种可能性。

【讨论】:

  • 谢谢戴夫,澄清了这一点。我想我要把这些期望放在我的spec/routing/* 目录中。这就是你所做的,对吧?
  • 是的,我就是这么做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2014-10-14
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多