我有一个UI组件,它调用方法getUserInfo()
,返回一连串的promises。当我第一次构建这个时,我认为这是一个好主意,我写了一堆
没有测试的代码。 getUserInfo()
需要几个输入参数并返回以下内容。它是一长串承诺的开始,它解析为一串字符串。
现在我正在尝试测试,但我遇到了很多麻烦...
...
// function geocodeLocation(zipcode){...};
// function getPlace(coordinates){...};
// ... etc
...
const utilities = {
getUserInfo: function (zipcode, gender) {
return geocodeLocation(zipcode)
.then(coordinates => getPlaces(coordinates))
.then(placeData => getDistanceFromEachPlace(origin, placeData))
.then(places => getMembersFromPlaces(places, gender))
.then(members => sortMembersByAge(members))
.then(sortedMembers => selectMembers(sortedMembers, gender))
}
};
module.exports = utilities;
getUserInfo
位于utilities
模块中,是唯一公开的功能。在测试时,我有点迷失了。 getUserInfo
是一个开头
长链功能。大多数链接的函数都会进行外部API调用,其中一些函数包含在promises中。如果这些函数没有进行外部API调用,那么它们就是混乱的
数据和创建新数据集(换句话说,应该进行单元测试的功能)。这里的存根和嘲弄似乎是合适的,但我对于什么是存根以及要模拟什么感到困惑。
我应该模拟每个函数,并测试承诺的最终结果吗?
此外,由于getUserInfo
是模块中唯一暴露的功能,因此单个单元测试似乎不可行。我怎样才能测试所有中间函数,比如getDistanceFromEachPlace
他们没有暴露?
import utilities from '../util/utilities'
import sinon from 'sinon'
import mocha from 'mocha'
describe('___api', () => {
it('should return a promise', () => {
const zipcode = '90210'
const gender = 'male'
// stub( other api functions here?? )
expect(utilities.getUserInfo(zipcode, gender).to.be.a('promise')
});
});
我现在可以测试一下吗?
答案 0 :(得分:0)
这是一个自以为是的答案,所以从中得到你想要的答案。
我的答案的基础是,如果你必须更改测试中的代码以实际测试它,那么你实际上并没有测试你想要的代码。
我应该模拟每个函数,并测试承诺的最终结果吗?
我会更专注于模拟用于进行外部API调用的任何内容。也就是说,保持utilities.js
不变,并在测试代码中使用sinon
来模拟用于进行外部API调用的库/代码。 (我无法给你一个如何做到这一点的例子,因为我不知道你在用什么)
我怎样才能在没有曝光的情况下测试所有中间函数,比如getDistanceFromEachPlace?
我不会 - 单元测试应该通过代码片段的界面进行测试。
总而言之,如果您想要更改模块的内部,rewire
是一个允许您这样做的模块。