我对单元测试、mocha和should.js非常陌生,我正在尝试为一个返回承诺的异步方法编写一个测试。这是我的测试代码:
var should = require("should"),
tideRetriever = require("../tide-retriever"),
moment = require("moment"),
timeFormat = "YYYY-MM-DD-HH:mm:ss",
from = moment("2013-03-06T00:00:00", timeFormat),
to = moment("2013-03-12T23:59:00", timeFormat),
expectedCount = 300;
describe("tide retriever", function() {
it("should retrieve and parse tide CSV data", function() {
tideRetriever.get(from, to).then(
function(entries) { // resolve
entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
},
function(err) { // reject
should.fail("Promise rejected", err);
}
);
});
});当我手动测试tideRetriever.get方法时,它一致地解析了一个由27个元素组成的数组(如预期的那样),但是无论expectedCount的值如何,测试都不会失败。下面是我的简单手动测试:
tideRetriever.get(from, to).then(
function(entries) {
console.log(entries, entries.length);
},
function(err) {
console.log("Promise rejected", err);
}
);如果需要的话,我也可以发布测试模块的源代码。
我是不是误解了摩卡或should.js?任何帮助都将不胜感激。
发布于 2015-02-17 12:12:13
更新
在某个时候,Mocha开始支持从测试中返回Promise,而不是添加done()回调。最初的答案仍然有效,但是使用这种方法测试看起来要干净得多:
it("should retrieve and parse tide CSV data", function() {
return tideRetriever.get(from, to).then(
function(entries) {
entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
}
);
});查看这个要旨以获得完整的示例。
原始
警告。接受的答案只适用于正常的异步代码,而不是承诺(作者使用的)。
不同之处在于,应用程序(在我们的例子中是Mocha)不能捕获来自允诺回调的异常,因此测试将通过超时而不是实际的断言失败。断言可以记录,也可以不记录,这取决于允诺实现。请在当文件上查看有关此问题的更多信息。
要正确地处理这个问题,您应该将err对象传递给done()回调,而不是抛出它。您可以使用Promise.catch()方法(在Promise.then()的onRejection()回调中不使用,因为它不会捕获来自同一方法的onFulfilment()回调的异常)。见下面的例子:
describe("tide retriever", function() {
it("should retrieve and parse tide CSV data", function(done) {
tideRetriever.get(from, to).then(
function(entries) { // resolve
entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
done(); // test passes
},
function(err) { // reject
done(err); // Promise rejected
}
).catch(function (err) {
done(err); // should throwed assertion
});
});
});PS done()回调在三个地方使用,以涵盖所有可能的情况。但是,如果不需要任何特殊的逻辑,则可以完全删除onRejection()回调。在这种情况下,Promise.catch()也将处理拒绝。
https://stackoverflow.com/questions/24071493
复制相似问题