如何在javascript中模拟构造函数调用

问题描述 投票:0回答:1

我如何在派生类中模拟创建父类的构造函数。

这是我正在测试的示例。

myclass.js

class a {

  constructor() {
     console.log('i am from class a constructor');
   }
  foo() {
    console.log('i am from class a foo method');
  }
}


class b {

  constructor() {
     console.log('i am from class b constructor');
   }
  baz() {
    let obj = new a();
    a.foo();
    console.log('i am from class b baz method');
  }
}

这是我的单元测试,我在嘲笑使用Sinon.js。我正在为类b-> baz()方法创建单元测试。我的期望是调用baz()方法不应调用实际的类a并且不应打印在构造函数类中的控制台。如何实现这一点。 sinon.createStubInstance()我曾经用来创建对象,但如何模拟构造函数?

myclass.test.js

describe('myclass' ()=> {
   it('should not call class a constructor', (done) => {
    let b_obj = new b()
    b_obj.baz();
    done()
   });
})

以上代码的输出打印

i am from class a constructor
i am from class a foo method
i am from class b baz method

上述代码的预期输出

// should be mocked .. i am from class a constructor
//should be mocked .. i am from class a foo method
i am from class b baz method
javascript node.js unit-testing mocha sinon
1个回答
0
投票

我做了一些重构,并使用proxyquire模拟类a

例如

a.js

class a {
  constructor() {
    console.log('i am from class a constructor');
  }
  foo() {
    console.log('i am from class a foo method');
  }
}

module.exports = a;

b.js

const a = require('./a');

class b {
  constructor() {
    console.log('i am from class b constructor');
  }
  baz() {
    let obj = new a();
    obj.foo();
    console.log('i am from class b baz method');
  }
}

module.exports = b;

b.test.js

const b = require('./b');
const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('61108610', () => {
  it('should pass', () => {
    const aInstanceStub = { foo: sinon.stub() };
    const aStub = sinon.stub().returns(aInstanceStub);
    const b = proxyquire('./b', {
      './a': aStub,
    });
    const logSpy = sinon.spy(console, 'log');
    const b_obj = new b();
    b_obj.baz();
    sinon.assert.calledOnce(aStub);
    sinon.assert.calledOnce(aInstanceStub.foo);
    sinon.assert.calledWithExactly(logSpy, 'i am from class b baz method');
  });
});

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

  61108610
i am from class b constructor
i am from class b baz method
    ✓ should pass


  1 passing (30ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   77.78 |      100 |      50 |   77.78 |                   
 a.js     |   33.33 |      100 |       0 |   33.33 | 3,6               
 b.js     |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/61108610

© www.soinside.com 2019 - 2024. All rights reserved.