可以在控制器测试中使用Post.first而不是分配(:post)吗?

时间:2015-07-31 02:42:36

标签: ruby-on-rails functional-testing

在rails(4.2.x)应用程序中,在控制器测试中,我看到他们使用assigns(:post)的很多示例,我可以使用Post.firstPost.find_by(title: 'foo')。我完全不了解assigns的必要性。 (我听说在rails 5中会弃用分配,但在那之前,是否可以直接使用该对象?)这样做是不对的,例如:

assert_redirected_to(post_path(Post.first))

而不是:

assert_redirected_to(post_path(assigns(:post))

2 个答案:

答案 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

,它们将会中断