测试Posts控制器的POST请求

时间:2014-02-28 12:06:27

标签: ruby-on-rails rspec

我正在尝试测试未经授权的用户向我的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混淆 - 即请求的名称与控制器的名称?

1 个答案:

答案 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请求被彻底拒绝,可以在没有参数的情况下对其进行测试。