我试图用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视图测试中是否有一种方法可以指定我在某个命名空间中测试视图?是否有一些金色的金块会让这种痛苦消失?
答案 0 :(得分:0)
如果您觉得这确实是RSpec问题,请将其记录在rspec-rails issues上。根据您的一般描述,这听起来像铁路问题。
在视图中使用render @products
时,会告诉Rails呈现partial。这与控制器操作中的render
不同。
根据Rails docs,render @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规范在每个规范的基础上查找视图局部的位置。