gpt4 book ai didi

mocha.js - 如何在 mocha 中测试类(class)?

转载 作者:行者123 更新时间:2023-12-04 18:24:19 30 4
gpt4 key购买 nike

在我走向 TDD 的过程中,我使用了 Mocha、chai 和 sinon。
那里肯定有一个学习曲线。

我的目标是编写一个测试来验证 method4 是否已执行。我如何做到这一点?

//MyData.js

 class MyData {

constructor(input) {
this._runMethod4 = input; //true or false
this.underProcessing = this.init();
}

method1() { return this.method2() }

method2() {

if (this._runMethod4) {
return this.method4();
} else {
return this.method3();
}

method4(){
return thirdPartyAPI.getData();
}
method3(){
return someAPI.fetchData();
}

init(){
return this.method1();
}

}

MyData.spec.js
describe('MyData', () => {

it('should execute method 4', function() {
let foo = new MyData(true);

foo.underProcessing.then(()=>{
// How do I verify that method4 was executed ??
expect(foo.method4.callCount).to.equal(1);
});


});
})

最佳答案

下面是一个例子:

const expect    = require('chai').expect;
const sinon = require('sinon');
const sinonTest = require('sinon-test');

sinon.test = sinonTest.configureTest(sinon);
sinon.testCase = sinonTest.configureTestCase(sinon);

describe("MyData", () => {
it("should execute method 4", sinon.test(function() {
let spy = this.spy(MyData.prototype, 'method4');
let foo = new MyData(true);

return foo.underProcessing.then(() => {
expect(spy.callCount).to.equal(1);
});
}));
});

作为附加要求,我添加了 sinon-test ,因为它在测试运行后帮助清理 spy / stub 非常有用。

主要特点是这一行:
let spy = this.spy(MyData.prototype, 'method4');

这将 MyData.prototype.method4 替换为 Sinon spy ,这是一个传递函数(因此它调用原始函数),它将记录它的确切调用方式、频率、参数等。您需要在创建实例之前执行此操作,因为否则你就太晚了(该方法可能已经通过构造函数中以 this.init() 开头的方法调用链被调用)。

如果你想使用一个不是传递的 stub (所以它不会调用原始方法),你也可以这样做:
let spy = this.stub(MyData.prototype, 'method4').returns(Promise.resolve('yay'));

因此,不是调用 thirdPartyAPI.getData() 并返回其结果, method4 现在将返回一个以 yay 值解析的 promise 。

剩下的代码应该不言自明,有一个警告:在 return 前面有一个明确的 foo.underProcessing.then(...)

我假设 foo.underProcessing 是一个 promise ,所以它是异步的,这意味着你的测试也应该是异步的。由于 Mocha 支持 promises,当你从测试中返回一个 promise 时,Mocha 会知道如何正确处理它(有一种使用 Mocha 制作 asynchronous test 的替代方法,涉及回调函数,但是当你测试基于 promise 的代码时,你不应该真正使用它们,因为很容易遇到超时或吞下异常)。

关于mocha.js - 如何在 mocha 中测试类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44292498/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com