在rails(4.2.x)应用程序中,在控制器测试中,我看到他们使用assigns(:post)
的很多示例,我可以使用Post.first
或Post.find_by(title: 'foo')
。我完全不了解assigns
的必要性。 (我听说在rails 5中会弃用分配,但在那之前,是否可以直接使用该对象?)这样做是不对的,例如:
assert_redirected_to(post_path(Post.first))
而不是:
assert_redirected_to(post_path(assigns(:post))
答案 0 :(得分:2)
assigns(:post)
只是对行动变量@post
的引用。
行动可能如下:
@post = Post.first
或:
@post = Post.find_by(title: 'foo')
在assigns(:post)
测试中,您可以从控制器操作中获取@post
变量。
答案 1 :(得分:1)
可以使用Post.first
,但将测试与数据库实现相结合。您正在测试控制器功能,因此您可以将对db的调用存根,并加快测试速度。
将这个电话收起来似乎是:
before { allow(Post).to_receive(:find){ build :post } }
在这种情况下,如果您选中assigns(:post)
,您的控制器规格将继续有效,但如果您选中Post.first