RSPEC:如何测试控制器操作返回 JSON Web 令牌
RSPEC: How to test that a JSON Web Token is returned by controller action
我正在使用 Devise 和 JWT 对我正在编写的项目中的用户进行身份验证。我很难弄清楚如何编写一个有用的测试来期望 JWT response.body
(因为每个都是加密的)。
我唯一能想到的就是测试它们的结构是否应该是 JWT(3 段,'.'
分隔字符串)。
有没有人遇到测试random/hashedreturns并提出更好的解决方案?
describe SessionTokensController, type: :controller do
let(:current_user) { FactoryGirl.create(:user) }
before(:each) do
sign_in current_user
end
describe '#create' do
it 'responds with a JWT' do
post :create
token = JSON.parse(response.body)['token']
expect(token).to be_kind_of(String)
segments = token.split('.')
expect(segments.size).to eql(3)
end
end
end
这真的取决于你到底想测试什么。
如果您只是想测试返回的令牌是否存在且有效,您可以执行以下操作:
it 'responds with a valid JWT' do
post :create
token = JSON.parse(response.body)['token']
expect { JWT.decode(token, key) }.to_not raise_error(JWT::DecodeError)
end
尽管验证令牌包含的声明似乎更有用:
let(:claims) { JWT.decode(JSON.parse(response.body)['token'], key) }
it 'returns a JWT with valid claims' do
post :create
expect(claims['user_id']).to eq(123)
end
在后一个示例中,您可以验证 JWT 中包含的确切声明。
let(:user) { create(:user, password: "123456") }
describe "POST authenticate_user" do
context "with a valid password" do
it "authenticates successfully" do
post :authenticate_user, params:{email: user.email, password: "123456"}, format: :json
parsed_body = JSON.parse(response.body)
# binding.pry
expect(parsed_body.keys).to match_array(["auth_token", "user"])
expect(parsed_body['user']['email']).to eql("joe@gmail.com")
expect(parsed_body['user']['id']).to eql(user.id)
end
it "authentication fails" do
post :authenticate_user, params:{email: user.email, password: "123456789"}, format: :json
parsed_body = JSON.parse(response.body)
expect(parsed_body['errors'][0]).to eql("Invalid Username/Password")
end
end
end
我正在使用 Devise 和 JWT 对我正在编写的项目中的用户进行身份验证。我很难弄清楚如何编写一个有用的测试来期望 JWT response.body
(因为每个都是加密的)。
我唯一能想到的就是测试它们的结构是否应该是 JWT(3 段,'.'
分隔字符串)。
有没有人遇到测试random/hashedreturns并提出更好的解决方案?
describe SessionTokensController, type: :controller do
let(:current_user) { FactoryGirl.create(:user) }
before(:each) do
sign_in current_user
end
describe '#create' do
it 'responds with a JWT' do
post :create
token = JSON.parse(response.body)['token']
expect(token).to be_kind_of(String)
segments = token.split('.')
expect(segments.size).to eql(3)
end
end
end
这真的取决于你到底想测试什么。
如果您只是想测试返回的令牌是否存在且有效,您可以执行以下操作:
it 'responds with a valid JWT' do
post :create
token = JSON.parse(response.body)['token']
expect { JWT.decode(token, key) }.to_not raise_error(JWT::DecodeError)
end
尽管验证令牌包含的声明似乎更有用:
let(:claims) { JWT.decode(JSON.parse(response.body)['token'], key) }
it 'returns a JWT with valid claims' do
post :create
expect(claims['user_id']).to eq(123)
end
在后一个示例中,您可以验证 JWT 中包含的确切声明。
let(:user) { create(:user, password: "123456") }
describe "POST authenticate_user" do
context "with a valid password" do
it "authenticates successfully" do
post :authenticate_user, params:{email: user.email, password: "123456"}, format: :json
parsed_body = JSON.parse(response.body)
# binding.pry
expect(parsed_body.keys).to match_array(["auth_token", "user"])
expect(parsed_body['user']['email']).to eql("joe@gmail.com")
expect(parsed_body['user']['id']).to eql(user.id)
end
it "authentication fails" do
post :authenticate_user, params:{email: user.email, password: "123456789"}, format: :json
parsed_body = JSON.parse(response.body)
expect(parsed_body['errors'][0]).to eql("Invalid Username/Password")
end
end
end