【问题标题】:Angular 2 : MockBackend returning 'undefined' responseAngular 2:MockBackend 返回“未定义”响应
【发布时间】:2017-01-19 23:28:56
【问题描述】:

我正在尝试使用 MockBackend 为我的服务编写单元测试,并且每次收到未定义的响应。任何帮助,将不胜感激。 我已经检查了以下所有这些解决方案,与我的相比,我真的看不出有什么不同。

这是我的服务:

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
    }) ) );
});

【问题讨论】:

    标签: unit-testing angular


    【解决方案1】:

    我可能是错的,但我相信您的问题首先是您从您的服务返回response.json().content as Object[]content 属性很可能未定义。我建议将您的响应映​​射到一个 json 对象并让您的组件处理它。

    getObjects() {
        return this.http.get( this.dealsUrl )
            .map(( response ) => response.json());
    }
    

    然后

    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' );
    

    希望对你有帮助

    【讨论】:

    • 修复从response.json().content as SomeObject[]response.json() 的响应解决了它。您建议的第二个更正并不是真正的问题,因为您可以看到我将fakeAsync 与处理我的异步调用的tick() 结合使用。但是,我仍然会接受这个答案作为正确答案。
    • 哦,我明白了,我会更新我的答案以供将来参考!很高兴我能提供帮助。
    • 非常感谢丹尼尔!第二双眼睛总是有帮助的。我知道配置没有问题,而且这些背后总是有一个愚蠢的错误;)
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2017-01-08
    • 2019-07-28
    • 1970-01-01
    • 2016-05-23
    • 2018-04-02
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多