Rails视图规范:无法在命名空间视图中查找部分

时间:2014-04-19 00:12:20

标签: ruby-on-rails view rspec rspec2

我试图用RSpec进行测试。我遇到的一个问题是让RSpec在render名称空间的视图测试中调用admin时找到部分内容。

基本上,在我看来,我有很多使用缩写语法的render调用,如下所示:

render @products

但是,我想因为RSpec缺乏知道此视图位于admin命名空间的上下文,所以它似乎找不到位于app/views/admin/products/_product.html.erb中的部分。为了让事情顺利进行,我必须做一些事情:

render partial: 'admin/products/product', collection: @products

但是,你知道,我非常依赖于较短的语法。这是遵循Rails惯例的重点。如果你愿意的话,作为一个如此优秀的男孩并把所有东西放在适当的地方的奖励。

所以,我想知道:我的RSpec视图测试中是否有一种方法可以指定我在某个命名空间中测试视图?是否有一些金色的金块会让这种痛苦消失?

2 个答案:

答案 0 :(得分:0)

如果您觉得这确实是RSpec问题,请将其记录在rspec-rails issues上。根据您的一般描述,这听起来像铁路问题。

在视图中使用render @products时,会告诉Rails呈现partial。这与控制器操作中的render不同。

根据Rails docsrender @customer

  

@customer实例变量包含Customer模型的实例,这将使用_customer.html.erb来呈现它。

遗漏的是_customer.html.erb的路径。不幸的是,目前的文档让你抓住这个。在collection信息下,是这个宝石:

  

Rails通过查看集合中的模型名称来确定要使用的partial的名称。实际上,您甚至可以创建异构集合并以这种方式呈现它,并且Rails将为集合中的每个成员选择适当的部分:

这实质上意味着,在您的视图中,当您执行render @customer时,尝试加载:app/views/customers/_customer.html.erb。不是您已经设置的命名空间。如果您希望使用命名空间,您的模型必须已经是该命名空间的一部分(即Admin::Product),或者您必须指定完整的部分路径(正如您已经发现的那样)。

答案 1 :(得分:0)

我知道这是一个老问题,但是此链接https://github.com/rspec/rspec-rails/issues/396可能会帮助遇到类似问题的其他任何人(例如我)。您可以配置rspec规范在每个规范的基础上查找视图局部的位置。