0

我正在使用 ngx-bootstrap 的 (3.0.1) ModalService 来显示一个包含组件的模式对话框

this.modalRef = this.modalService.show(MyDialogComponent);

我的单元测试中有这个(开玩笑的)

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [MyComponent, MyDialogComponent],
    schemas: [CUSTOM_ELEMENTS_SCHEMA],
    providers: [MyService],
    imports: [
      ModalModule.forRoot(),
    ],
  })
  .compileComponents();
}));

顽固的错误告诉我无法解析 BsModalService 的所有参数:(?,?)。我能找到的答案是提到缺少合适的@Injectable()装饰器,但这显然超出了我的控制范围,而且它是无关紧要和误导的——装饰器存在于 ngx-bootstrap 的源代码中。

我尝试从包中显式提供所有组件和服务(而不是 ModuleWithProviders,但这也无济于事。

缺乏想法。

更新 1

尝试评论进出

import 'core-js/es7/reflect';

在 plyfills.ts 中。似乎没关系。除非有一个与我失踪相关的 Jest 配置设置?

4

2 回答 2

0

尝试在您的 polyfills.ts 中导入 core-js/es7/reflect,这是使您的测试工作所必需的

import 'core-js/es7/reflect';
于 2018-11-05T14:52:56.073 回答
0

由于来自 BsModalService 的服务会动态填充 DOM(entryComponents),因此您可以通过添加到 configureTestingModule来使用BrowserDynamicTestingModule API:

beforeEach(async(() => {
TestBed.configureTestingModule({
    imports: [ ModalModule.forRoot() ],
    declarations: [ MyDialogComponent ],
}).overrideModule(BrowserDynamicTestingModule, {
  set: {
    entryComponents: [ HelloComponent ],
  }
}).compileComponents();

}));

使用调度API触发模板元素(例如按钮),然后检查它是否在 DOM 中弹出。

这是一个带有实时示例的堆栈闪电战。

注意:由于 ngx BsModalService将 DOM 填充为 angular 根节点的兄弟节点,因此我无法使用 Angular API 来选择模态元素,因此我不得不使用 DOM querySelector。如果有人有更好的方法,请发表评论,以便我更新

于 2018-11-05T21:00:14.387 回答