【问题标题】:Angular2 Testing: Service returning function instead of object arrayAngular2测试:服务返回函数而不是对象数组
【发布时间】:2016-12-01 20:42:12
【问题描述】:

我想为我用 Angular 2.1.0 编写的服务编写一些测试:

@Injectable()
export class MyService {
    api_base_url = 'http://' + environment.apiHost + ':5000/api/';

    constructor(private http: Http) {
    }

    getMyObjs(query): Observable<MyObj[]> {
        let params = new URLSearchParams();

        if (query != null && query.length > 0)
            params.set('q', query);

        return this.http.get(this.api_base_url + 'entries/' + pipelineId, {search: params})
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.entries || {};
    }

    private handleError(error: any) {
        // In a real world app, we might use a remote logging infrastructure
        // We'd also dig deeper into the error to get a better message
        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }

}

这是目前为止的测试:

describe('Service: Entry', () => {

beforeEach(async(() => {
    TestBed.configureTestingModule({
        providers: [
            BaseRequestOptions,
            MockBackend,
            MyService,
            {
                provide: Http,
                useFactory: (backend: MockBackend, options: BaseRequestOptions) => {
                    return new Http(backend, options);
                },
                deps: [MockBackend, BaseRequestOptions]
            }
        ]
    });

}));

it('should return myobjs', inject([MockBackend, MyService], (backend: MockBackend, service: MyService) => {
    const my_body = JSON.stringify([
        {
            "timestamp": "2016.01.01T12:55:00Z",
            "level": 0,
        }
    ]);
    const baseResponse = new Response(new ResponseOptions({body: my_body, status: 200}))
    backend.connections.subscribe((connection: MockConnection) => {
        return connection.mockRespond(baseResponse);
    });

    service.getMyObjs(null).subscribe((obs: MyObj[]) => {
        console.log(obs);
        expect(obs.length).toBe(1);
    });

}));
});

这个测试失败,说Expected 0 to be 1.。 console.log 显示LOG: function obs() { ... }。我不明白为什么这是一个函数而不是一个对象数组。 我正在使用 ng test 命令运行测试。

【问题讨论】:

    标签: angular angular2-services angular2-testing


    【解决方案1】:

    在模拟的 HTTP 响应中,您返回的对象结构与 extractData() 所期望的不同。我想它应该是这样的:

        // ... stuff ...
    it('should return myobjs', ...) => {
        const my_body = JSON.stringify({
            entries: [{
                "timestamp": "2016.01.01T12:55:00Z",
                "level": 0,
            }]
        });
    

    【讨论】:

    • 你救了我的命。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2020-04-11
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多