我正在测试我编写的一个加载本地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'}]
?
任何解释都会非常感激!
答案 0 :(得分:0)
您在ngOnInit:this.softwareList = this.http.get
所以softwareList有一个可观察的签名:
对象(_isScalar,观察者,......)
要通过测试,您可以断言可观察的响应:
expect(res).to.be.eq(mockResponse.about.dependencies.software);