我想在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时发生冲突。