【问题标题】:Mocking constructor of a class with jasmine, jest or ts-mockito使用 jasmine、jest 或 ts-mockito 模拟类的构造函数
【发布时间】:2019-08-19 13:11:19
【问题描述】:

我有一组类以这种方式接收角度之外的一些依赖项。

import {TypeATest} from '...../TypeA.model'
import { TypeBTest } from '..../TypeB.model'
import { SomeDependency } from './services/SomeDependency'
import { SomeAnother } from './services/SomeAnother'
  // ....

@Injectable({
  providedIn: 'root'
})
export class TestingService {
  this.activeTest: AnyTestType;

  constructor(private readonly injectorService: InjectorService) {}

  loadTest(TypeOfTest) {
    const someDependency = this.injectorService.get(SomeDependency)
    const someAnother = this.injectorService.get(SomeAnother)
      switch(TypeOfTest) {
        case TypeA:
            injector
            this.activeTest = new TypeATest(someDependency, someAnother);
            break;
        case TypeB:
            this.activeTest = new TypeBTest(someAnother);
            break;
      }
  }

  startTest(){
    this.activeTest.start()
  }

// .. more this.activeTest uses...
}

我正在对加载该外部类的服务进行单元测试,但我不想创建 TypeATestTypeBTest 或类似的,而只是模拟结果(它们都有相同的 API)但我找不到如何嘲笑他们。有没有办法做到这一点?

【问题讨论】:

  • 请使用更多代码更新您的问题。具体来说,上述 switch 语句在您的代码中的什么位置以及如何访问 TypeATestTypeBTest(它们是使用依赖注入传递还是静态导入?)现在我们看不到足够的代码来回答。
  • 嗨@brian-lives-outdoors,我已经更新了问题。

标签: angular jestjs


【解决方案1】:

这两个构造函数是它们各自模块的命名导出

您可以使用带有模块工厂的jest.mock 模拟整个模块:

jest.mock('...../TypeA.model', () => {
  const start = jest.fn();
  const result = { start };
  return jest.fn(() => result);  
});

test('something', () => {
  // ...
});

...或仅使用jest.spyOn模拟模块的命名导出

import * as TypeB from '..../TypeB.model';

test('something', () => {
  const spy = jest.spyOn(TypeB, 'TypeBTest');
  const start = jest.fn();
  spy.mockReturnValue({ start });
  // ...
})

【讨论】:

  • 感谢您的回复!我不确定您如何使用调用 TypeATest.start 的工厂进行测试。
  • 我更新了我的答案以使start 更易于访问和测试。现在模块工厂每次都返回相同的对象,因此您可以再次调用它来访问返回的对象并测试其start 属性。我还将start 模拟从 named export 模拟中提取出来,以使其更易于访问和测试。 @distante
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多