mocha - 检索承诺测试的结果

时间:2017-02-23 03:45:37

标签: javascript node.js unit-testing testing mocha

我希望在before

中获得承诺的结果
describe('unsubscribe', function() {
        var arn;
        this.timeout(10000);
        before(function(done) {
            sns.subscribe('param1', 'param2').then(
                (result) => {
                arn = result;
                done();
            },
            (error) => {
                assert.fail(error);
                done();
            });
        });
        it('("param") => promise returns object', function() {
            const result = sns.unsubscribe(arn);
            expect(result).to.eventually.be.an('object');
        });
    });

同样,在after我希望在测试中获得承诺的结果

describe('subscribe', function() {
        var arn;
        this.timeout(10000);
        it('("param1","param2") => promise returns string', function(done) {
            sns.subscribe('param1', 'param2').then(
                (result) => {
                    arn = result;
                    expect(result).to.be.a('string');
                },
                (error) => {
                    assert.fail(error);
                    done();
                });
        });
        after(function(done) {
            sns.unsubscribe(arn).then(
                (result) => done());
        });
    });

这段代码是否写得正确?有没有更好的做法?建议的方法是什么?

1 个答案:

答案 0 :(得分:1)

每个你想让Mocha等待承诺得到解决的地方你应该只返回承诺而不是使用done。因此,您的before挂钩可以简化为:

    before(() => sns.subscribe('param1', 'param2')
        .then((result) => arn = result));

这比在这里和那里done更具可读性,并且必须对错误条件做任何特殊处理。如果有错误,承诺将拒绝,Mocha将捕获它并报告错误。没有必要执行自己的断言。

您有一个测试和after挂钩,只需返回他们使用的承诺而不是使用done,也可以简化。如果你测试取决于承诺,记得返回它。您在其中一项测试中忘记了它:

it('("param") => promise returns object', function() {
  const result = sns.unsubscribe(arn);
  // You need the return on this next line:
  return expect(result).to.eventually.be.an('object');
});

提示:如果您有一个测试套件,其中所有测试都是异步的,您可以使用--async-only选项。这将使Mocha要求所有测试调用done或返回一个承诺,并可以帮助捕获您忘记返回承诺的情况。 (否则,如果他们不提出任何错误,这种情况很难。)

在回调中定义一个变量describe并在before/beforeEach个钩子中设置它并在after/afterEach钩子中检查它是在钩子和测试之间传递数据的标准方法。摩卡不提供特殊设施。所以,是的,如果您需要传递数据,这是承诺的结果,您需要像.then那样执行任务。您可能会遇到一些示例,其中人们而不是使用describe回调中定义的变量将在this上设置字段。哦,这可行,但IMO很脆弱。一个非常简单的例子:如果你设置this.timeout来记录一些仅对你的测试有意义的数字,那么你已经覆盖了Mocha为改变它的超时而提供的功能。您可以使用另一个现在不会发生冲突的名称,但在发布新版本的Mocha时会发生冲突。