摩卡柴测试受保护的路线

时间:2017-10-16 17:53:05

标签: node.js express mocha chai passport-local

我有一台Express服务器,我使用本地护照进行身份验证。我有以下受保护路线:

app.post("/api/test", connect.ensureLoggedIn("/"), (req, res) => {
let test = new Test(req.body);

test
  .save()
  .then(data => {
    return res.json(data);
  })
  .catch(e => {
    return res.status(HTTP_RESPONDE_BAD_REQUEST).send(e);
  });
});

我想知道如何测试上述路线以确保用户登录。

这是我目前的测试(它没有通过,因为我无法发送身份验证:

it("Testing protected route", done => {
 chai
  .request(server)
  .post("/api/test")
  .send(test)
  .end((err, res) => {
    expect(res.status).to.equal(200);
    done();
  });
});

我尝试了以下操作,但是当我运行测试时,他们会将我重定向到登录页面。

it("Testing protected route", done => {
 chai
  .request(server)
  .post("/api/test")
  .set('Authorization', 'Bearer ' + token) // user token id
  .send(test)
  .end((err, res) => {
    expect(res.status).to.equal(200);
    done();
  });
});

it("Testing protected route", done => {
 chai
  .request(server)
  .post("/api/test")
  .set('token', token) // user token id
  .send(test)
  .end((err, res) => {
    expect(res.status).to.equal(200);
    done();
  });
});

有更简单的方法来测试吗?

1 个答案:

答案 0 :(得分:0)

我正在使用supertestmocha进行单元测试以及令牌的自定义标头,但我的测试使用了类似的模式。在运行任何测试之前,数据将加载到数据库中并且用户已登录,然后该令牌将用于需要身份验证的每个测试。

TestUtils类

  this.authenticateUser = (user, app) =>
    new Promise((resolve, reject) => {
      request(app)
      .post('/authenticate')
      .send({
        email: user.email,
        password: user.test_password,
      })
      .end((err, res) => {
        if (err) {
          return reject(err);
        }
        return resolve(res.body.token);
      });
    });

测试类

describe('Authed Routes', () => {
  let app = null;

  let authUser = null;

  before((done) => {
    // mocking should happen before the app is created.
    app = require('../server');

    // Populate redis data
    TestUtils.populateRedis(() => {
      // Populate db data
      TestUtils.syncAndPopulateDatabase('public-tests', () => {
        // Get the test user
        authUser = TestUtils.getUser();
        // Authenticate the user to get a token
        TestUtils.authenticateUser(authUser, app)
        .then((accessToken) => {
          // Keep the token on the user so we can use it in the tests
          authUser.access_token = accessToken;
          return done();
        })
        .catch((err) => done(err));
      });
    });
  });

  describe('/secure/route', () => {
    it('should allow /secure/route with correct token provided', (done) => {
      request(app)
      .get('/secure/route')
      // add the access token from the user as a header value
      .set('x-access-token', authUser.access_token)
      .expect(200)
      .end((err, res) => {
        done();
      });
    });
  });
});