在控制器测试中可以使用 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.first
或 Post.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
,它们将失效
在 rails (4.2.x) 应用程序中,在控制器测试中,我看到很多例子,他们使用 assigns(:post)
,我可以使用 Post.first
或 Post.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