Angular7 Jasmine 和 Restangular:无法获得正确的测试模块配置

Angular 7 Jasmine and Restangular: Cannot get proper testing module configuration

给定一个导入 RestAngular 的前端组件,在 CTOR 中声明它并在 ngOnInit 中使用它,如下所示:

import { Restangular } from 'ngx-restangular'

constructor(
    private Restangular: Restangular,
    private ChangeDetectorRef: ChangeDetectorRef,

  ) { }

ngOnInit() {
 this.Restangular.all("Person")
      .all("Kind")
      .getList()
      .subscribe(pTypes => {
        this.personTypes = pTypes;
      }); 
}

上面的代码在提供代码时完美运行。

我正试图让 Jasmine 来创建这个 class,它在 Restangular 上令人窒息。所以我包括了以下提供者如下:

  beforeEach(async () => {
    TestBed.configureTestingModule({
      providers:[Restangular, RestangularHttp, HttpBackend],

这似乎修复了所有 Restangular 依赖项,但现在我看到了:

现在我看到这个错误 TypeError: this.http.handle is not a function

我不明白为什么在Jasmine这边我必须提供这些依赖,前端组件不是处理得很好吗?为什么 jasmine 不像 Angular 那样实例化前端?它似乎是由于没有 "real" 个 Restangular 实例被注入引起的。

解决方法: 如果 front-end 组件尝试使用 Restangular,Jasmine 测试必须导入 Restangular 模块。像这样:

import { RestangularModule } from "ngx-restangular"

  beforeEach(async () => {
    TestBed.configureTestingModule({      
      imports: [FontAwesomeModule, FormsModule, ReactiveFormsModule, NgSelectModule, RestangularModule],

这将最低限度地允许在此代码中创建组件

  beforeEach(() => {

    fixture = TestBed.createComponent(Component);
    component = fixture.componentInstance;

创建组件后,它会执行包含 restangular 调用的 ngOnInit 代码,如下所示:

this.Restangular.all("Something")()
  .subscribe(pTypes => {
    this.personTypes = pTypes;
  });

如果上面的 Restangular 调用失败,测试不会捕捉到它,因为组件已经创建!如果调用失败,您必须放入要在绑定数据字段上执行的特定期望语句(对于 Restangular 调用)才能使测试失败。