使用Angular / Mocha

时间:2018-01-15 17:21:32

标签: angular unit-testing mocha observable

我正在测试我编写的一个加载本地JSON文件的组件,一切都很棒并且运行良好但我的测试并不顺利!在我的组件中,我有以下内容加载我在项目中使用的JSON项目列表:

public softwareList: Observable<any>;

public ngOnInit() {
    this.softwareList = this.http.get('path/to/software.json').map((res: any) => {
        const respJson = res.json();
        return respJson.about.dependencies.software;
    });
}

在我的测试中,我模拟了JSON和http.get调用的结果,所有看起来都很好 - 这里是我的测试代码......

// here's the mock...
const mockResponse = {
    about: {
      dependencies: {
        heading: 'Software Dependencies',
        explaination: 'Blah blah blah',
        software: [
          {
            name: 'Angular & Angular Material',
            url: 'https://github.com/angular'
          }
        ]
      }
    }
  };


// here's my test
it('should load the Software Dependencies list', async(() => {
    const instance = componentFixture.componentInstance;
    const spyHttpGet = sinon.spy(instance.http, 'get');

    instance.ngOnInit();

    expect(spyHttpGet.calledOnce).to.be.eq(true);
    expect(spyHttpGet.withArgs'path/to/software.json').calledOnce).to.be.eq(true);

    instance.softwareList.subscribe((res:any) => {
      console.log(res); // [Object{name: 'Angular & Angular Material', url: 'https://github.com/angular'}]
      expect(instance.softwareList).to.be.eq(mockResponse.about.dependencies.software);
    });
  }));

现在最后的测试,订阅回调中的那个失败了。我收到以下错误

  

AssertionError:期望{Object(_isScalar,observers,...)}来   等于[数组(1)]

从console.log中我看到以下内容:

[Object{name: 'Angular & Angular Material', url: 'https://github.com/angular'}]

这就是我的期望!这也是我期望instance.softwareList的价值!我不明白为什么instance.softwareList没有更新subscribe返回的值?我错过了什么,为什么不是instance.softwareList = [{name: 'Angular & Angular Material', url: 'https://github.com/angular'}]

任何解释都会非常感激!

1 个答案:

答案 0 :(得分:0)

您在ngOnInit:this.softwareList = this.http.get

中影响visualList的observable

所以softwareList有一个可观察的签名:

  

对象(_isScalar,观察者,......)

要通过测试,您可以断言可观察的响应:

expect(res).to.be.eq(mockResponse.about.dependencies.softwar‌​e);