Жасмин заменить класс при тестировании другого класса - PullRequest
0 голосов
/ 19 июня 2020

У меня есть простой старый класс, а не компонент, с этим методом, который я хочу протестировать

static fromJson(json: any): ClientDTO {
    const ret: ClientDTO = Object.assign(new ClientDTO(), json)

    const dp = new DateWithoutTimePipe()

    ret.contractStart = dp.transform(json.contractStart)
    ret.contractEnd = dp.transform(json.contractEnd)

    return ret
}

В рамках моего метода тестирования я хочу убедиться, что метод преобразования был вызван с ожидаемые параметры. Я подумал, что мне нужен какой-то шпион, но поскольку DateWithoutTimePipe не вводится, я не уверен, как подделать этот класс в моем тесте.

Первоначально я пробовал следующее, и, конечно, сразу понял, что шпион на самом деле никогда не использовался.

it('should decode dates', () => {
    const spy = jasmine.createSpyObj('DateWithoutTimePipe', ['transform'])
    const dates = {'contractStart': '2020-01-01', 'contractEnd': '2030-02-03'}
    const dto = ClientDTO.fromJson(dates)

    expect(dto).toBeInstanceOf(ClientDTO)
    expect(spy.transform).toHaveBeenCalledTimes(2)

    const all = spy.transform.calls.all()

    expect(all[0].args).toBe(['2020-01-01'])
    expect(all[1].args).toBe(['2030-02-03'])
})

1 Ответ

0 голосов
/ 19 июня 2020

Вы можете использовать spyOn (obj, methodName) для установки шпиона на существующий объект.

Например,

MyClass.ts:

import { ClientDTO } from './ClientDTO';
import { DateWithoutTimePipe } from './DateWithoutTimePipe';

export class MyClass {
  static fromJson(json: any): ClientDTO {
    const ret: ClientDTO = Object.assign(new ClientDTO(), json);

    const dp = new DateWithoutTimePipe();

    ret.contractStart = dp.transform(json.contractStart);
    ret.contractEnd = dp.transform(json.contractEnd);

    return ret;
  }
}

ClientDTO.ts

export class ClientDTO {
  public contractStart;
  public contractEnd;
}

DateWithoutTimePipe.ts:

export class DateWithoutTimePipe {
  public transform(data) {}
}

MyClass.test.ts:

import { MyClass } from './MyClass';
import { DateWithoutTimePipe } from './DateWithoutTimePipe';
import { ClientDTO } from './ClientDTO';

describe('62461783', () => {
  it('should pass', () => {
    const transformSpy = spyOn(DateWithoutTimePipe.prototype, 'transform').and.callFake((data) => {
      if (data === '2020-01-01') {
        return 'transformed 2020-01-01';
      }
      if (data === '2030-02-03') {
        return 'transformed 2030-02-03';
      }
    });
    const json = { contractStart: '2020-01-01', contractEnd: '2030-02-03' };
    const actual = MyClass.fromJson(json);
    const all = transformSpy.calls.all();
    expect(all[0].args).toEqual(['2020-01-01']);
    expect(all[1].args).toEqual(['2030-02-03']);
    expect(actual).toBeInstanceOf(ClientDTO);
    expect(transformSpy).toHaveBeenCalledTimes(2);
  });
});

результат модульного теста:

Executing 1 defined specs...
Running in random order... (seed: 45771)

Test Suites & Specs:
(node:41885) ExperimentalWarning: The fs.promises API is experimental

1. 62461783
   ✔ should pass (6ms)

>> Done!


Summary:

?  Passed
Suites:  1 of 1
Specs:   1 of 1
Expects: 4 (0 failures)
Finished in 0.028 seconds
...