我正在尝试测试未经授权的用户向我的Rails 4博客应用的帖子控制器发出的直接POST请求的结果。在Rails Tutorial之后,我已经为Users控制器实现了如下功能测试:
describe 'attempting to issue a direct POST request while not signed in' do
before { post users_path }
specify { expect(response).to redirect_to signin_path }
end
但是,在before
块中尝试对帖子控制器进行相同的测试失败:
describe 'attempting to issue a direct POST request while not signed in' do
before { post posts_path }
specify { expect(response).to redirect_to signin_path }
end
ArgumentError: wrong number of arguments (1 for 0)
包含patch post_path(post)
和delete post_path(post)
函数的等效测试,并通过控制器中的before_action传递。
我的路线:
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
RSpec是否被POST / Post混淆 - 即请求的名称与控制器的名称?
答案 0 :(得分:1)
嗯,这确实是方法和模型名称之间的混淆,虽然我看起来不够上游看到它:我的测试设置如下:
describe 'in the Posts controller' do
let(:post) { Post.create(...) }
.
.
.
describe 'attempting to issue a direct POST request while not signed in' do
before { post posts_path } # 'post' is interpreted to be the variable!
specify { expect(response).to redirect_to signin_path }
end
end
因此,HTTP方法POST与在测试块开始时声明的变量'post'之间存在命名冲突。将变量重命名为'test_post'修复了所有内容。
D'哦!
@DaveNewton:很明显,如果POST请求被彻底拒绝,可以在没有参数的情况下对其进行测试。