angular - 是否可以使用 ng-mocks 从模拟服务中保留一些方法?

标签 angular testing ng-mocks

我正在向 Angular 项目添加测试。有一项服务从 API 获取一些数据并从这些数据创建一些业务实体。
我使用 ng-mocks 模拟了这个服务来测试依赖它的组件。 .
原始服务如下所示:

class DataService {
  public getEntityFromApi(): Observable<Entity> {
    return http.get(...).pipe(
      map(httpResponse => {
        return this.createEntityFromApiData(httpResponse);
      })
    );
  }

  private createEntityFromApiData(apiData: any): Entity {
    // ...
  }
}
它被 mock 为:
getMockedServiceProvider() {
  const testData = ...;
  return MockProvider(DataService, {
    getEntityFromApi: () => {
      let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
      return of(entity);
    }
  });
}
因此,模拟服务能够在不向 API 发出请求的情况下返回对象,但我必须复制从普通 json 创建对象的代码。
在模拟服务中避免这种重复的最佳方法是什么?
  • 是否有可能以某种方式保留私有(private) createEntityFromApiData从 mock 的原始服务?
  • 我是否应该将这个逻辑隔离在另一个服务中,该服务仅负责我将在测试中按原样使用的实例化?
  • 其他方法?
  • 最佳答案

    在您的情况下,如果您想从服务中保留某些内容,那么有两种选择:

  • 保留服务本身
  • 将事物提取到单独的类/函数中。

  • 如果您想在所有测试中返回相同的假数据,您可以考虑使用 ngMocks.defaultMock .
    然后您需要在 src/test.ts 中调用一次.
    ngMocks.defaultMock(DataService, () => ({
      getEntityFromApi: () => {
        let entity = // duplicated code from the createEntityFromApiData method to create the object from testData
        return of(entity);
      },
    }));
    

    关于angular - 是否可以使用 ng-mocks 从模拟服务中保留一些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65307175/

    相关文章:

    java - 本地 Google Appengine 上的 JUnit 测试中的电子邮件正文为空

    angular - 如何检查测试期间调用内部组件的方法?

    Angular2 为什么我们需要 es6-shim

    angular - 如何创建可以支持ngModel和ngControl指令的组件

    angular - 如何动态更新Angular组件的样式

    javascript - 从 localStorage Angular 的数组中删除项目

    gwt - 测试异步 rpc

    testing - Maven 测试与 ant 测试(现在更具体)