【问题标题】:Sinon in typescript stub打字稿存根中的诗农
【发布时间】:2020-08-31 01:33:35
【问题描述】:

打字稿中的Sinon无法正确导入子模块..请找到以下代码 下面的代码是文件 parent.ts

import submodule from './sub-module'
class Parent {

/**
 * name
 */
public parentmethod() {
   let sub = new submodule();
   let result = sub.submethod();
   return result;
}

}

export default Parent

和名为 submodule.ts 的子模块代码

class submodule{
public submethod(){

    return "hai submodule"
}

}
export default submodule

和单元测试脚本如下

"use strict";
import chai from 'chai';
import sinon from "sinon";
import submodule from '../src/sub-module'
import  parentmodule from '../src/app'
const expect = chai.expect;
describe("test",function(){
    let stub;
    beforeEach(() => {        
       // stub = sinon.stub(sub ,'saveuser');
     });
    it("test methods",function(){
        stub= sinon.createStubInstance(submodule);
        let parentObj = new parentmodule();
        const user =  parentObj.parentmethod(); 
        expect(stub.submethod.calledOnce).to.be.true;
    })

})

结果显示预期的 false 为 true。意味着子方法没有在这里调用。任何人都可以帮助我哪里出错了

【问题讨论】:

    标签: typescript unit-testing chai sinon stub


    【解决方案1】:

    您应该使用Link Seamsproxyquire 来存根./sub-module 模块。

    例如

    parent.ts:

    import Submodule from './sub-module';
    
    class Parent {
      public parentmethod() {
        let sub = new Submodule();
        let result = sub.submethod();
        return result;
      }
    }
    
    export default Parent;
    

    sub-module.ts:

    class Submodule {
      public submethod() {
        return 'hai submodule';
      }
    }
    export default Submodule;
    

    parent.test.ts:

    import { expect } from 'chai';
    import sinon from 'sinon';
    import proxyquire from 'proxyquire';
    
    describe('61798668', () => {
      it('should pass', () => {
        const submoduleStub = {
          submethod: sinon.stub().returns('stubbed data'),
        };
        const SubmoduleStub = sinon.stub().returns(submoduleStub);
        const Parent = proxyquire('./parent', {
          './sub-module': {
            default: SubmoduleStub,
          },
        }).default;
        const parent = new Parent();
        const actual = parent.parentmethod();
        expect(actual).to.be.eq('stubbed data');
        sinon.assert.calledOnce(SubmoduleStub);
        sinon.assert.calledOnce(submoduleStub.submethod);
      });
    });
    

    带有覆盖率报告的单元测试结果:

      61798668
        ✓ should pass (2797ms)
    
    
      1 passing (3s)
    
    ---------------|---------|----------|---------|---------|-------------------
    File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ---------------|---------|----------|---------|---------|-------------------
    All files      |   85.71 |      100 |      50 |   85.71 |                   
     parent.ts     |     100 |      100 |     100 |     100 |                   
     sub-module.ts |      50 |      100 |       0 |      50 | 3                 
    ---------------|---------|----------|---------|---------|-------------------
    

    【讨论】:

    • const submoduleStub = { submethod: sinon.stub().returns('stubbed data'), }; const SubmoduleStub = sinon.stub().returns(submoduleStub); const Parent = proxyquire('./parent', { './sub-module': { default: SubmoduleStub, }, }).default;你能解释一下吗..为什么我们要再次创建 SubmoduleStub 为什么我们不能直接传递 submoduleStub
    • 这是一个可行的解决方案,但不是问题的答案
    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2021-10-16
    • 2016-08-04
    • 2016-08-29
    • 1970-01-01
    • 2017-04-22
    • 2021-09-26
    • 2020-10-17
    相关资源
    最近更新 更多