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

Is it ok to use Post.first instead of assigns(:post) in a controller test?

在 rails (4.2.x) 应用程序中,在控制器测试中,我看到很多例子,他们使用 assigns(:post),我可以使用 Post.firstPost.find_by(title: 'foo') 代替。我根本不明白 assigns 的必要性。 (我听说assigns会在rails5中被弃用,但在那之前,直接使用对象是不是可以?)这样做是不是错误的,例如:

assert_redirected_to(post_path(Post.first))

而不是:

assert_redirected_to(post_path(assigns(:post))

assigns(:post) 只是对动作变量 @post 的引用。 操作可能如下所示:

@post = Post.first

或:

@post = Post.find_by(title: 'foo')

在通过 assigns(:post) 的测试中,您可以从控制器操作中获取 @post 变量。

使用 Post.first 是可能的,但会将您的测试与数据库实现结合起来。您正在测试控制器功能,因此您可以停止对数据库的调用并加快测试速度。

终止此调用将类似于:

before { allow(Post).to_receive(:find){ build :post } }

在这种情况下,如果您选中 assigns(:post),您的控制器规格将继续有效,但如果您选中 Post.first

,它们将失效