Mocha使用异步初始化代码进行测试

时间:2018-04-12 17:13:38

标签: node.js unit-testing typescript mocha

我正在为一个REST客户端库编写测试,该库必须是" login"使用OAuth交换服务。为了防止我要测试的每个端点的登录,我想写一些"测试设置"但我不确定我该怎么做。

我的测试项目结构:

  • 测试
    • 端点category1.spec.ts
    • 端点category2.spec.ts

如果我只有一个"端点类别"我有这样的事情:

describe('Endpoint category 1', () => {
  let api: Client = null;

  before(() => {
    api = new Client(credentials);
  });

  it('should successfully login using the test credentials', async () => {
    await api.login();
  });

  it('should return xyz\'s profile', async () => {
    const r: Lookup = await api.lookup('xyz');
    expect(r).to.be.an('object');
  });
});

我的问题:

由于login()方法是第一个测试,因此它可以工作,客户端实例也可用于以下所有测试。但是,我如何进行某种设置,我可以在其中记录api实例"可用于我的其他测试文件?

3 个答案:

答案 0 :(得分:3)

应将公共代码移至beforeEach

  beforeEach(async () => {
    await api.login();
  });

此时should successfully login using the test credentials没有多大意义,因为它没有断言任何内容。

答案 1 :(得分:1)

describe('Endpoint category 1', () => {
  let api: Client = null;

  beforeEach(() => {
    api = new Client(credentials);
  });

  afterEach(() => {
    // You should make every single test to be ran in a clean environment.
    // So do some jobs here, to clean all data created by previous tests.
  });

  it('should successfully login using the test credentials', async () => {
    const ret = await api.login();
    // Do some assert for `ret`.
  });

  context('the other tests', () => {
    beforeEach(() => api.login());
    it('should return xyz\'s profile', async () => {
      const r: Lookup = await api.lookup('xyz');
      expect(r).to.be.an('object');
    });
  });
});

答案 2 :(得分:0)

你看过https://mochajs.org/#asynchronous-code吗?

您可以在测试功能中输入一个完成参数,然后您将收到一个回调函数。

已完成()已完成(错误/例外)

这样做也可以在之前和之后使用。

当调用done()时,mocha知道您的异步代码已经完成。

阿。如果您想测试登录,则不应将此连接提供给其他测试,因为在默认配置中无法保证测试顺序。

之后只需测试登录和注销。

如果您需要使用“login-session”进行更多测试,请使用befores描述一个新测试。