我希望在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());
});
});
这段代码是否写得正确?有没有更好的做法?建议的方法是什么?
答案 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时会发生冲突。