【问题标题】:Can't resolve all parameters for ObservableDataSource: ([object Object], ?)无法解析 ObservableDataSource 的所有参数:([object Object], ?)
【发布时间】:2018-02-27 21:33:18
【问题描述】:

我目前正在使用angular material data-table cdk。为了将我的 ngrx/store 连接到数据表 CDK,我正在扩展 DataSource CDK 的连接方法,以允许注入 observable。以下是本题的相关代码

export class ObservableDataSource extends DataSource<any> {
  private value: any[];
  private key: string;
  constructor(value: any[], key) {
    super();
    this.value = value;
    this.key = key;
  }

  connect() {
    return combineLatest(this.value, (data) => {
      return data[this.key];
    });
  }

  disconnect() {} 
}

当对这个组件进行单元测试时(对于好奇的人来说,它有一个 @Component 装饰器,只是没有显示),我收到以下错误: Failed: Can't resolve all parameters for ObservableDataSource: ([object Object], ?).

然后我继续为 value 和 key 提供值:

beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ObservableDataSource ],
      providers:[
        {provide: 'value', useValue: []},
        {provide: 'key', useValue: ''},
      ]
    })
    .compileComponents();
  }));

但是,错误Failed: Can't resolve all parameters.. 仍然出现。关于我如何正确提供构造函数值的任何建议,以便 Jasmine/Karma 可以正确解析参数,我们不胜感激。谢谢你。

【问题讨论】:

  • 你的ObservableDataSource 真的有用吗?我认为在单元测试之外尝试在应用程序中使用组件时,您也会遇到这些相同的错误。可以注入字符串或数组之类的值,但您需要使用@Inject 函数来执行此操作。见here
  • 它确实有效。执行以下操作:this.dataSource = new ObservableDataSource(this.value, 'visible'); 按预期工作。
  • 我明白了。然后你必须在单元测试中做同样的事情。试图提供像你一样的值是行不通的。
  • 好的。因此,出于好奇,我将如何在单元测试中做同样的事情?
  • 您不必这样做。 Here 是用来了解我的意思的东西。例子是测试一个服务,但是思路还是一样的;你会在新建组件时包含你的参数。

标签: angular unit-testing jasmine karma-runner


【解决方案1】:

在对其进行了更多研究之后,我执行了以下操作以使其正常工作。首先,我意识到这是一个服务,而不是一个组件。所以我把我的@Component() 装饰器换成了@Injectable。 其次,我为服务提供了构造服务的值,如下所示:

providers: [
   {provide: ObservableDataSource, useValue: new ObservableDataSource([], 'visible')}
]

这解决了上述问题,并允许我继续使用 TestBed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2018-04-12
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多