超级测试,测试安全的REST API

Joh*_*nGa 8 node.js jwt supertest express-jwt

我正在编写一个受API保护的REST API的集成测试jwt.一个API操作POST /user/token返回jwt给定的a username和a password,然后该令牌用于操作列表,例如:

GET /user/:id
Run Code Online (Sandbox Code Playgroud)

路由使用的位置jwt({secret: secret.secretToken}),因此令牌包含在http标头中Authorization.

使用超级测试进行测试时,我可以进行嵌套测试,但我想首先获取令牌,然后使用此令牌进行其他操作测试.

POST /user/token => 12345
GET /user/:id, `Authorization Bearer 12345`
GET /user/:foo, `Authorization Bearer 12345`
Run Code Online (Sandbox Code Playgroud)

如何避免为每个操作测试生成新令牌(见下文),但只使用一个由POST/user/token生成的令牌.

it('should get a valid token for user: user1', function(done) { 
  request(url)
    .post('/user/token')
    .send({ _id: user1._id, password: user1.password })
    .expect(200) // created
      .end(function(err, res) {
        // test operation GET /user/:id
Run Code Online (Sandbox Code Playgroud)

ves*_*sse 25

您想要执行单个POST /user/token,然后使用在每个测试用例中收到的令牌?如果是这样,那么使用before您正在使用的测试框架的钩子(Mocha?)并将令牌存储到变量,例如

describe('My API tests', function() {

  var token = null;

  before(function(done) {
    request(url)
      .post('/user/token')
      .send({ _id: user1._id, password: user1.password })
      .end(function(err, res) {
        token = res.body.token; // Or something
        done();
      });
  });

  it('should get a valid token for user: user1', function(done) { 
    request('/get/user')
      .set('Authorization', 'Bearer ' + token)
      .expect(200, done);
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 如果我们有多个文件和文件夹,其中散布着单元测试,而无需在每个文件中重复获取令牌,如何实现这一点? (3认同)