我想在before中获得promise的结果

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());
        });
    });


这段代码编写正确吗?有更好的做法吗?推荐的做法是什么?

最佳答案

您想让摩卡咖啡在等待解决承诺的每个地方,您都应该返回承诺而不是使用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挂钩中进行检查是在挂钩和测试之间传递数据的标准方法。 Mocha没有为此提供特殊的设施。因此,是的,如果您需要传递数据(这是诺言的结果),则需要像您一样在.then中执行分配。您可能会遇到一些示例,在这些示例中,人们将使用describe上的字段来代替在this回调中定义的变量。哦,这可行,但IMO却很脆弱。一个非常简单的示例:如果将this.timeout设置为记录仅对测试有意义的数字,那么您将覆盖Mocha提供的用于更改其超时的功能。您可以使用另一个名称,该名称现在不会冲突,但是会在发布新版本的Mocha时发生冲突。

09-30 13:39
查看更多