测试Promise链中的未曝光函数

时间:2017-11-30 21:42:32

标签: javascript mocha es6-promise sinon

我有一个UI组件,它调用方法getUserInfo(),返回一连串的promises。当我第一次构建这个时,我认为这是一个好主意,我写了一堆 没有测试的代码。 getUserInfo()需要几个输入参数并返回以下内容。它是一长串承诺的开始,它解析为一串字符串。 现在我正在尝试测试,但我遇到了很多麻烦...

utilities.js

...
// 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 他们没有暴露?

testfile.js

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')
  });
});

我现在可以测试一下吗?

1 个答案:

答案 0 :(得分:0)

这是一个自以为是的答案,所以从中得到你想要的答案。

我的答案的基础是,如果你必须更改测试中的代码以实际测试它,那么你实际上并没有测试你想要的代码。

  

我应该模拟每个函数,并测试承诺的最终结果吗?

我会更专注于模拟用于进行外部API调用的任何内容。也就是说,保持utilities.js不变,并在测试代码中使用sinon来模拟用于进行外部API调用的库/代码。 (我无法给你一个如何做到这一点的例子,因为我不知道你在用什么)

  

我怎样才能在没有曝光的情况下测试所有中间函数,比如getDistanceFromEachPlace?

我不会 - 单元测试应该通过代码片段的界面进行测试。

总而言之,如果您想要更改模块的内部,rewire是一个允许您这样做的模块。

https://github.com/jhnns/rewire