我正在为我的函数编写单元测试,从一些REST API获取信息。我使用ramda
Future
类型(source)
以下测试很奇怪:
it('should return Maybe of Nothing', done => {
let response = {
status: 200,
json: () => {
return {
results: []
}
}
}
let fakeFetch = {
fetch: () => {
return new Promise((resolve, reject) => {
resolve(response)
})
}
}
// String -> Future Error Maybe
let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch);
result.fork(err => {
assert.fail(err, 'expected to return Maybe of Nothing');
done();
}, data => {
expect(Maybe.isJust(data)).to.be.true;
done();
})
})
data
应为Maybe.Nothing
类型。如果我希望测试通过Maybe.isNothing
,但我想看看测试失败时会发生什么,所以我将其设置为Maybe.isJust
,返回false。看了一会儿之后,我注意到当expect
失败时它跳转到错误处理(err
回调),然后停止执行任何断言(导致2000ms超时)
在Future
源代码中,我看到当成功回调失败时,它会执行失败回调。如何完成此测试以显示数据不符合我的预期?
答案 0 :(得分:0)
我认为问题在于,当您的REST调用失败时,永远不会调用done()
。
不确定expect
在失败时是否有.catch方法,但您可以尝试添加
.catch(done);
在期望功能结束时。
希望有所帮助。
答案 1 :(得分:0)
调用future.fork(errorHandler, successHandler)
目前会确保successHandler
中抛出的所有异常都会传播到errorHandler
。
解决这个问题的一种方法(尽管可能并不理想,因为它没有记录)是调用future._fork(errorHandler, successHandler)
而不是future.fork
,其中successHandler
中不会捕获错误。
或者,许多测试框架支持将错误传递给done
回调,例如:
result.fork(err => {
done('Expected to return Maybe of Nothing: ' + err);
}, data => {
expect(Maybe.isJust(data)).to.be.true;
done();
})
答案 2 :(得分:0)
我认为Ramda不应该在那里发现异常。但我不知道他们想要做什么。
看起来你正在使用摩卡。将你的未来转换为承诺可能是个好主意,然后观察承诺。即:
const futureToPromise = future => {
return new Promise((resolve, reject) => future.fork(reject, resolve))
}
it('should return Maybe of Nothing', () => {
let response = {
status: 200,
json: () => {
return {
results: []
}
}
}
let fakeFetch = {
fetch: () => {
return new Promise((resolve, reject) => {
resolve(response)
})
}
}
// String -> Future Error Maybe
let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch);
// return it because Mocha can handle this
return futureToPromise(result).then(data => {
expect(Maybe.isJust(data)).to.be.true;
}, () => {
// fail
assert.fail(err, 'expected to return Maybe of Nothing');
})
})