【问题标题】:Jasmine replace class while testing another classJasmine 在测试另一个类时替换类
【发布时间】:2020-10-09 04:58:21
【问题描述】:

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

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

【问题讨论】:

    标签: typescript unit-testing jasmine angular-test


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我从来没有想过要监视原型。
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多