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

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

at ./src/myClass.ts

class myClass{

    methodA(){
    ...
    }

    methodB(){
    ...
    }
}

, и мне нужно высмеивать метод A, так что я сделал, чтобы создайте файл

.src / mocks / myClass.ts

class myClass{

    methodA(){
    ...
    }
}

, затем на ./tests/myClass.test.ts

'use strict';
import { myClass } from "../src/myClass";
jest.mock('../src/myClass');

describe('myClass', () => {
    it('returns methodB',  () => {
        const c = new myClass();
        //this one mocked correctly
        c.methodA();
        // how can I instruct jest to use the original method?
        const data= c.methodB();

        expect(data)
          .toMatchObject({})
    }, 
    3000)
});

, как упоминалось в комментариях выше, я не могу понять, как использовать оригинальный методB

Я предполагаю, что я издеваюсь над всем классом. И я должен go для насмешки над одноклассными методами. Какова шутливая практика - создавать фиктивный файл, который будет имитировать только определенные методы класса?

1 Ответ

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

__mocks__ каталог и jest.mock, выберите один. В следующем примере используются jest.mock:

myClass.ts:

export class myClass {
  methodA() {
    return 'real a';
  }

  methodB() {
    return 'real b';
  }
}

myClass.test.ts:

import { myClass } from './myClass';

jest.mock('./myClass', () => {
  const { myClass: originalMyClass } = require.requireActual('./myClass');
  const mMyClass = {
    methodA: jest.fn().mockReturnValueOnce('mock a'),
    methodB: originalMyClass.prototype.methodB,
  };
  return { myClass: jest.fn(() => mMyClass) };
});

describe('60633642', () => {
  it('should mock methodA', () => {
    const c = new myClass();
    const actual = c.methodA();
    expect(jest.isMockFunction(c.methodA)).toBeTruthy();
    expect(actual).toBe('mock a');
    expect(c.methodA).toBeCalledTimes(1);
  });

  it('should call original methodB', () => {
    const c = new myClass();
    const actual = c.methodB();
    expect(jest.isMockFunction(c.methodB)).toBeFalsy();
    expect(actual).toBe('real b');
  });
});

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

 PASS  stackoverflow/60633642/myClass.test.ts
  60633642
    ✓ should mock methodA (6ms)
    ✓ should call original methodB (2ms)

------------|---------|----------|---------|---------|-------------------
File        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------|---------|----------|---------|---------|-------------------
All files   |   85.71 |      100 |   66.67 |   83.33 |                   
 myClass.ts |   85.71 |      100 |   66.67 |   83.33 | 3                 
------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        4.797s, estimated 9s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...