【问题标题】:Angular 5 mocking of javascript object in JestJest中javascript对象的Angular 5模拟
【发布时间】:2018-10-01 06:35:38
【问题描述】:

我对角度和玩笑都很陌生。我有这样的课:

import {CloudWatchLogs} from 'aws-sdk/clients/browser_default';
import {isNullOrUndefined} from 'util';

@Injectable()
export class MyService {

  private cloudWatchLogs: CloudWatchLogs = null;

  constructor() {}

  startService() {
    setupService();
    myOtherTask();
  }

  private setUpService() {

    if (!isNullOrUndefined(this.cloudWatchLogs)) {

      this.cloudWatchLogs = new CloudWatchLogs();
      // setup options
    }
  }

  private void myOtherTask() {

    this.cloudWatchLogs.doSomething();
    this.cloudWatchLogs.doSomethingElse();

  }
}

我正在尝试使用 Jest 对 MyService 运行单元测试。我想知道的是,是否可以按照此类的编写方式模拟 doSomething 和 doSomethingElse 的 CloudWatchLogs 方法,请记住 CloudWatchLogs 是一个 javascript 对象,而不是 Angular 可注入对象。

我认为能够模拟 CloudWatchLogs 的唯一解决方案是创建一个可注入的服务来包装 CloudWatchLogs,然后将其注入 MyService。

【问题讨论】:

  • 您当前的代码在服务中将 cloudWatchLogs 作为私有。外部测试将无法查看内容以测试正在发生的事情。考虑修改代码以进行测试或依赖注入,以便能够查看 cloudWatchLogs 的内容。当您导入 CloudWatchLogs 时,可以将其替换为 Jest 模拟以设置测试内容,但私有变量引用将阻止外部测试能够检查该变量。
  • 谢谢,有道理。您能告诉我如何用 Jest 模拟替换并设置内容吗?

标签: angular jestjs


【解决方案1】:

所以这样做的方法是执行以下操作:

const mockDoSomething = jest.fn();
const mockDoSomethingElse = jest.fn();
jest.mock('aws-sdk/clients/cloudwatchlogs', () => {
  return jest.fn().mockImplementation(() => {
    return {
      doSomething: mockDoSomething,
      doSomethingElse: mockDoSomethingElse
    };
  });
});

然后在每个测试中可以模拟返回值,例如

 const myReturnValue = 'whatever';
 mockDoSomething.mockReturnValueOnce(myReturnValue);

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 2017-05-23
    • 2020-07-04
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多