【问题标题】:How to fix undefined is not an object (evaluating 'newOptions.merge')?如何修复未定义的不是对象(评估'newOptions.merge')?
【发布时间】:2018-07-02 21:59:49
【问题描述】:

我正在编写 Angular 2 应用程序。此测试由 Angular cli 创建,默认失败:

  it('should render title in a h1 tag', async(() => {
    let fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    let compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toContain('app works!');
  }));

错误信息是:

失败:./AppComponent 类 AppComponent 中的错误 - 内联模板:51:14 原因:未定义不是对象(正在评估“newOptions.merge”) mergeOptions@webpack:///~/@angular/http/src/http.js:47:0

据我所知,newOptions.merge 是从node_modules/@angular/http/src/http.js 内部的mergeOptions 方法调用的。

我必须做些什么才能使测试通过?

这里是gist fro app.component.ts
她是gist for app.component.html

【问题讨论】:

  • 请发布您的 AppComponent 的内容。我们需要看到它才能说出这个测试失败的原因
  • @JesseCarter,我在最后的问题文本中添加了要点。
  • 你能不能把组件的HTML也贴出来
  • @JesseCarter,也发布了 app.component.html 的要点。

标签: unit-testing angular


【解决方案1】:

您正在使用 Angular 2 Http 服务,因此您需要注入 defaultOptions 参数,在您的情况下,该参数为空。

完成这项工作的最佳方案是在您的 spec.ts 文件中添加以下行:

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [{
                provide: Http,
                useFactory: (
                    backend: ConnectionBackend, 
                    defaultOptions: BaseRequestOptions
                ) => {
                    return new Http(backend, defaultOptions);
                },
                deps: [BaseRequestOptions]
            },
            {
                provide: BaseRequestOptions,
                useClass: BaseRequestOptions
            }
        ]
    });
});

因此,当您告诉提供者 BaseRequestOption 使用类 BaseRequestOptions 时,这一行至关重要。

【讨论】:

  • 这并不能解决问题,还有什么需要改变的吗?
猜你喜欢
  • 2021-01-09
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2019-09-26
  • 2019-12-12
  • 2019-08-16
  • 2017-01-16
相关资源
最近更新 更多