Как смоделировать вызов конструктора в javascript - PullRequest
0 голосов
/ 08 апреля 2020

Как мне издеваться над созданием конструктора моего родительского класса в производном классе.

вот пример, который я тестирую.

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');
  }
}

Вот мой unittest, использующий Sinon. js Я издеваюсь я создаю unittest для класса 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

1 Ответ

0 голосов
/ 09 апреля 2020

Я сделал несколько рефакторов и использовал 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...