Unit testing 角度2:MockBackend返回';未定义';响应
我正试图使用MockBackend为我的服务编写一个单元测试,每次我得到一个未定义的响应。任何帮助都将不胜感激。 我已经检查了下面所有的解决方案,与我的相比,我真的没有看到太多的差异Unit testing 角度2:MockBackend返回';未定义';响应,unit-testing,angular,Unit Testing,Angular,我正试图使用MockBackend为我的服务编写一个单元测试,每次我得到一个未定义的响应。任何帮助都将不胜感激。 我已经检查了下面所有的解决方案,与我的相比,我真的没有看到太多的差异 这是我的服务: import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { SomeObject } from './someObject'; @Injectable() export
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { SomeObject } from './someObject';
@Injectable()
export class SomeService {
private serviceUrl: string = 'http://localhost:8080/getObjects';
constructor( private http: Http ) { }
getObjects() {
return this.http.get( this.serviceUrl )
.map(( response ) => response.json().content as SomeObject[])
}
}
以下是我的测试:
import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { TestBed, tick, fakeAsync, inject } from '@angular/core/testing';
import { MockBackend } from '@angular/http/testing';
import { SomeService } from './some.service';
import { SomeObject } from './someObject';
describe( 'SomeServiceTest', () => {
let stubData: SomeObject[] = [
new SomeObject( 1, "Title" )
];
beforeEach(() => {
TestBed.configureTestingModule( {
providers: [
SomeService,
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: ( backend: MockBackend, options: BaseRequestOptions ) => {
return new Http( backend, options );
},
deps: [MockBackend, BaseRequestOptions]
}
]
});
});
it( 'should fetch data', inject( [SomeService, MockBackend], fakeAsync(( service: SomeService, mockBackend: MockBackend ) => {
let res: SomeObject[];
mockBackend.connections.subscribe( c => {
expect( c.request.url ).toBe( 'http://localhost:8080/getObjects' );
c.mockRespond( new Response( new ResponseOptions( {
body: JSON.stringify( stubData )
}) ) );
});
service.getObjects().subscribe(( response ) => {
console.log( "response :: " + JSON.stringify( response ) ); // this is where I am seeing undefined
res = response;
});
tick();
expect( res[0].name ).toBe( 'Title' ); // this returns an exception TypeError: Cannot read property '0' of undefined
}) ) );
});
我可能错了,但我相信您的问题是,首先,您正在从您的服务返回
response.json().content as Object[]
。content
属性很可能未定义。我建议将您的响应映射到json对象,并让您的组件处理它
getObjects() {
return this.http.get( this.dealsUrl )
.map(( response ) => response.json());
}
然后
希望这有助于将
response.json().content作为SomeObject[]
修复为response.json()
解决了这个问题。您建议的第二个更正并不是真正的问题,正如您所看到的,我将fakeAsync
与处理异步调用的tick()
结合使用。不过,我还是会接受这个答案为正确答案。哦,我明白了,我会更新我的答案以备将来参考!很高兴我能帮忙。非常感谢丹尼尔!!第二双眼睛总是有帮助的。我知道配置没有问题,而且这些配置背后总是有一个愚蠢的错误;)
service.getSomeObjectsUsingObservable().subscribe(( response ) => {
console.log( "response :: " + JSON.stringify( response ) );
if (response.content){
res = response as SomeObject[];
}
else {
//- fail test
}
});
tick();
expect( res[0].name ).toBe( 'Title' );