我在使用 Chai Spies 时遇到问题。我很难理解语法是如何工作的。
在这里,我正在尝试一个简单的例子。模仿
myMap
方法的 array.map
函数:
function myMap(inputArray, callback) {
let newArr = [];
for (i = 0; i < inputArray.length; i++) {
let nEl = callback(inputArray[i]);
newArr.push(nEl);
};
return newArr;
}
module.exports = myMap;
测试:
const chai = require('chai');
const expect = chai.expect;
const spies = require('chai-spies');
chai.use(spies);
const myMap = require('../problems/my-map');
describe('function myMap', function () {
const arr = [1, 2, 3];
const cb1 = el => el*2;
it('should return new array passed through callback', function () {
expect(myMap(arr, cb1)).to.deep.equal([2, 4, 6]);
});
it('should preserve original array', function () {
expect(arr).to.deep.equal([1,2,3]);
});
it('see if .map used on array', function () {
expect(chai.spy.on(arr, 'map')).to.not.have.been.called();
});
it('callback called array.length times', function () {
let spy1 = chai.spy(cb1);
expect(spy1).to.have.been.called.exactly(arr.length);
})
});
使用间谍的测试 3 按预期工作,如果我向函数引入
.map
方法,则会失败。
但是测试号 4 给出了相同的结果,即在期望 3 的情况下有 0 个回调。当然,我在语法上弄乱了一些东西,但我在互联网上找不到任何简单的示例。
我正在使用降级的 Chai 版本 4.3.0,因为与 ES6 存在一些冲突,我还不知道如何解决。
好的,我已经弄清楚了,谢谢你,jonrsharpe。 正确的测试是这样的:
it('callback called array length times', function () {
let spy1 = chai.spy(cb1);
myMap(arr, spy1);
expect(spy1).to.have.been.called.exactly(arr.length);
});
您可以将回调与 chai.spy(callback) 互换,然后您可以检查间谍发生了什么。 不知道为什么在广阔的互联网上没有这样的间谍使用示例来让新手知道它是如何工作的。