Правильный способ издеваться над экземпляром метода класса - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы знать, как правильно смоделировать метод экземпляра класса.

Допустим, у меня есть два класса:

class A {
  doSomething() {
   /* do something here. */
  }
}

class B extends A {
  doSomethingElse() {
    this.doSomething() // calls doSomething
  }
}

Теперь я пытаюсь написать модуль тесты на B#doSomethingElse, и я не хочу вызывать A#doSomething, поэтому мне нужно смоделировать этот метод экземпляра. Является ли это возможным? Я придумал следующее:

import B from './b'

let called = true

jest.mock('./a', () => {
  class A {
    public doSomething() {
      called = true;
    }
  }

  return {
    __esModule: true,
    A
  };
});

describe('B',  () => {
  beforeEach(() => {
    called = false
  });

  describe('doSomethingElse', () => {
    const b = new B()
    b.doSomethingElse()

    expect(called).toEqual(true)
  });
});

Как видите, я проверяю, правильно ли B#doSomethingElse вызывает A#doSomething. Это на самом деле работает, но это зависит от «глобальной» переменной (called), которая меня как-то беспокоит. Есть ли лучший способ достичь того же результата?

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете использовать jest.spyOn (object, methodName) , чтобы создать заглушку для метода doSomething.

Например,

index.ts:

export class A {
  doSomething() {
    console.log('real implementation');
  }
}

export class B extends A {
  doSomethingElse() {
    this.doSomething();
  }
}

index.test.ts:

import { B } from './';

describe('60853078', () => {
  it('should pass', () => {
    const doSomethingStub = jest.spyOn(B.prototype, 'doSomething').mockReturnValueOnce();
    const b = new B();
    b.doSomethingElse();
    expect(doSomethingStub).toBeCalledTimes(1);
    doSomethingStub.mockRestore();
  });
});

Результаты модульных испытаний с отчетом о покрытии:

 PASS  stackoverflow/60853078/index.test.ts (10.383s)
  60853078
    ✓ should pass (11ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   90.91 |      100 |      75 |    87.5 |                   
 index.ts |   90.91 |      100 |      75 |    87.5 | 3                 
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        12.658s
...