【问题标题】:How to structure Rspec Request tests for APIs requiring user authentication如何为需要用户身份验证的 API 构建 Rspec 请求测试
【发布时间】:2017-12-19 22:59:28
【问题描述】:
我正在为应用开发 API。我正在尝试为需要参数但也属于用户的路由编写 rspec 请求测试,我通常需要 JWT 令牌才能访问。
例如,我将如何编写一个规范来测试路由POST /stocklist/:stocklist_id/balance/show
为此,我需要一个同时拥有库存清单的用户。我正在使用 FactoryGirl,并且我使用工厂进行了功能测试,但我不确定如何在测试中合并这么多部分。
【问题讨论】:
标签:
ruby-on-rails
rspec
factory-bot
【解决方案1】:
您可以使用机架测试。
https://github.com/rack-test/rack-test
下面是一个例子。首先,我们将创建一个用户和一个关联的 stock_list。您应该在功能测试中有执行此操作的示例。然后我们需要找到一种方法来传递所需的令牌。在机架测试中,您可以通过参数。您需要传递将在您的测试环境中工作的键的键和值。然后您可以测试控制器操作是否确实产生了您希望的结果。在这里,我假设我们有一些模型的计数为 0,并且该模型是在 post 操作中创建的。
describe 'my_api' do
let!( :user ){ create :user }
let!( :stock_list ){ create :stock_list, user: user }
specify do
expect( SomeModel.count ).to eq 0
post "/stocklist/#{stock_list.id}/balance/show", { token: "some_token" }
expect( SomeModel.count ).to eq 1
expect( last_response.status ).to eq 200
expect( JSON.parse( last_response.body, symbloize_keys:true )[:my_value] ).to eq 'something'
end
end
【解决方案2】:
您可以模拟返回登录用户的控制器方法,如下所示:
@user = FactoryGirl.create :user
# populate user with relationship objects
expect(controller).to_receive(:current_user).and_return(@user)
如果需要,您还可以使用授权令牌设置 http 标头
request.env['HTTP_AUTHORIZATION'] = token