【问题标题】:Angular2 Component test - Error: Can't resolve all parametersAngular2 组件测试 - 错误:无法解析所有参数
【发布时间】:2017-01-26 22:43:40
【问题描述】:

我正在第一次使用 Karma/Jasmine 等测试我的一个组件,并且大部分时间都在关注 docs on testing。我的组件需要 3 个构造函数参数;

constructor(
  private myService: MyService,
  private renderer: Renderer,
  private element: ElementRef
) { }

我已尝试模拟/存根基于this section of the docs 的那些依赖项,如下所示;

// Mocks/Stubs
const myServiceStub = {};
class MockElementRef {}
class MockRenderer {}

// beforeEach block
beforeEach(() => {
  TestBed.configureTestingModule({
    declarations: [ MyComponent ],
    providers: [
      { provide: ElementRef, useClass: MockElementRef },
    { provide: Renderer, useClass: MockRenderer },
      { provide: MyService, useValue: myServiceStub},
    ]
  });

  fixture = TestBed.createComponent(MyComponent);
});

尽管如此,每当我运行测试时,我都会收到以下错误;

Error: Can't resolve all parameters for MyComponent: (?, ?, ?).
    at SyntaxError.ZoneAwareError (test.ts:9250:33)
    at SyntaxError.BaseError [as constructor] (test.ts:44243:16)
    at new SyntaxError (test.ts:44453:16)
    at CompileMetadataResolver._getDependenciesMetadata (test.ts:61503:31)

我在这里缺少什么?谢谢!

【问题讨论】:

  • 你需要TestBed.compileComponents,这是异步的。请参阅使用模板测试组件的部分。
  • 不是@jonrsharpe,模板是内联的,不在单独的文件中

标签: angular testing mocking jasmine


【解决方案1】:

可能是循环 DI 造成的,尝试重构你的组件 MyComponent 以像这样注入服务:

constructor(@Inject(forwardRef(() => MyComponentService)) private myService: MyComponentService) {}

【讨论】:

  • 这似乎可以解决问题。什么会导致循环DI呢?该服务只是一个基础服务,没有注入依赖,包含一些抽象的业务逻辑方法。
  • 一般来说,当你有 2 个相互依赖的服务时,就会出现循环依赖。我有一个应用程序,我在其中一直引用服务中的组件并遇到了这个问题。
  • 或者它不是参考,但我在服务中动态创建一个组件 - 不记得确切;)
  • 突然间,已经通过的测试由于这个错误而开始甚至没有运行。不幸的是,我有一段时间没有登记入住,所以无法确定变化。我很想知道为什么会这样,但很高兴我找到了继续的方法。
猜你喜欢
  • 1970-01-01
  • 2017-07-14
  • 2019-03-16
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2018-01-07
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多