RSpec的post和get方法无法识别不存在的路由

时间:2017-10-19 15:19:56

标签: ruby-on-rails rspec

我正在使用BDD方法为JSON REST API执行请求规范。这意味着规范默认会失败,因为没有真正实现,包括路由。这是一个简单的例子:

  describe 'POST /users' do
    context 'when the request is valid' do
      before { post "/users", params: {userName: 'johndoe22'}}

      it 'creates and returns the user' do
        expect(json['userName']).to eq('johndoe22')
      end

      it 'returns status code 201 (created)' do
        expect(response).to have_http_status(201)
      end
    end
    ...
  end

基本上我要求一些东西(使用 get post ),然后我将响应解析为JSON。问题是,如果 / users 不存在,而不是获取 ActionController :: RoutingError:没有路由匹配错误, post 会无声地失败,当我尝试将响应解析为JSON时,规范失败了。此响应实际上包含无路由匹配错误。

换句话说,当调用 post 方法时,测试失败,而不是在我尝试解析响应(一个无法解析为JSON的常规HTML页面)时测试失败。 / p>

Failure/Error: JSON.parse(response.body)

 JSON::ParserError:
   784: unexpected token at '<!DOCTYPE html>
   <html lang="en">
   ...

作为参考,我会松散地遵循本教程:https://scotch.io/tutorials/build-a-restful-json-api-with-rails-5-part-one。如您所见,在执行请求规范时,他会收到相应的错误。

为什么会这样?我错过了某种配置吗?

1 个答案:

答案 0 :(得分:0)

如果您没有看到预期的

ActionController::RoutingError: No route matches

这很可能是因为某些路线实际匹配该路径。

也许您的路线中有通配符或其他内容。您可以在控制台中查看,如下所示:

Rails.application.routes.recognize_path('/users', method: 'POST')