运行Mocha测试校验NetworkManager对象是否成功初始化问题求助
问题原因分析
- 核心错误1:断言对象错了。当你用
__set__把NetworkManager替换成Sinon Stub后,执行new NetworkManager()时,调用的是你这个被stub的NetworkManager函数本身,而非你手动创建的clientFake上的constructor属性。你写的clientFake.constructor是个完全没被调用的空stub,自然断言不通过。 - 次要问题:业务代码的传参不符合类定义要求。
NetworkManager的构造函数要求第一个参数是credentials,第二个才是subscriptionId,你现在只传了一个参数,就算测试过了正式运行也会报错。
修复方案
1. 测试用例修改
直接对stub的NetworkManager本身做断言即可,不需要额外给clientFake加constructor stub,修改后的代码如下:
describe('schedule', () => { let revert; let networkManagerStub; beforeEach(() => { // 直接创建NetworkManager的stub networkManagerStub = stub(); revert = reverseProxy.__set__({ 'NetworkManager': networkManagerStub }); }); // 测试执行后清理stub,避免影响其他用例 afterEach(() => { revert(); }); it('run lookup', async () => { await stubContext(reverseProxy); // 断言stub本身被调用了1次即可 expect(networkManagerStub.calledOnce).to.equal(true); // 如果要验证是通过new关键字调用、以及传参是否正确,可以新增以下断言(等你业务代码修复参数后) // expect(networkManagerStub.calledWithNew()).to.equal(true); // expect(networkManagerStub.firstCall.args).to.deep.equal([你期望的credentials实例, subscriptionId]) }); });
2. 业务代码参数修复
你当前业务代码里初始化NetworkManager的传参顺序不对,需要补全credentials参数:
module.exports = async function checkNetwork(context) { // 第一个参数传你的credentials实例,第二个才是subscriptionId const client = new NetworkManager( yourCredentialsInstance, subscriptionId, ); };
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

