茉莉花替换类,同时测试另一个类



我有一个普通的旧类,而不是一个组件,我想用这种方法进行测试

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

您可以使用 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

最新更新