Angular2模式不会在因果报应中运行

Angular2模式不会在因果报应中运行,angular,karma-runner,angular2-modal,Angular,Karma Runner,Angular2 Modal,我的angular2应用程序中angular2模式运行良好。然而,我在通过业力进行测试时遇到了问题。我已经和你一起搭建了我的试验台 beforeEach(() => { TestBed.configureTestingModule({ imports: [ HttpModule ], providers: [ ApiService,

我的angular2应用程序中angular2模式运行良好。然而,我在通过业力进行测试时遇到了问题。我已经和你一起搭建了我的试验台

beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpModule
            ],
            providers: [
                ApiService,
                MockBackend,
                UiComponentService,
                BaseRequestOptions,
                AlertCenterService,
                {
                    provide: Http,
                    useFactory: (backend: any, options: any) => new Http(backend, options),
                    deps: [MockBackend, BaseRequestOptions]
                },
                Overlay,
                OverlayRenderer,               
                Modal
            ]
        });
    });
但是,我得到了一个奇怪的DI错误:

Error: No provider for Modal$$1!
Error: DI Error

UiComponentService是我使用模态的地方。试验在添加模态之前进行。我在任何地方都找不到附加了$$1的对Modal的引用,我也不知道它是从哪里来的。

我想Modal也缺少依赖项。我见过这样的错误,错误只解释了服务的查找依赖项的问题,而不是它所依赖的依赖项,即使这是根本原因。您如何在主应用程序中配置它?只是通过向提供程序添加模式,还是导入某个Module.forRoot。如果是后者,您应该对测试执行相同的操作

但是 您真的需要为单元测试提供完整的工作模式吗。模拟它可能更好,因为您需要测试的只是服务的行为。我假设服务所做的就是调用Modal上的某个方法。所以这就是你真正需要测试的

let modal;

beforeEach(() => {
  modal = { openModal: jasmine.createSpy('openModal') }

  ...
  providers: [
    { provide: Modal, useValue: modal }
  ]
})

it('', () => {
  doSomething()

  expect(modal.openModal).toHaveBeenCalledWith(whatever);
})

这只是假设Modal有一个方法openModal。您真正需要测试的是服务调用OpenModel方法,因为这是正在测试的服务的行为。

我想模式也缺少依赖项。我见过这样的错误,其中只有错误只解释了服务的查找依赖项的问题,而不是它所依赖的依赖项,即使这是根本原因。您如何在主应用程序中配置它?只是通过向提供程序添加模式,还是导入某个Module.forRoot。如果是后者,你应该为测试做同样的事情。就是这样!我应该早点问。你介意写下来作为回答吗?我想把这归功于你。