简体   繁体   English

Angular 2/4 Jasmine单元测试具有json对象结构的服务

[英]Angular 2/4 Jasmine unit testing a service with json object structure

I have a service that I want to unit test. 我有要进行单元测试的服务。 It has a current json array object in which when this observable is subscribed to, it works fine. 它有一个当前的json数组对象,在其中订阅了此Observable时,它可以正常工作。

However, what am I doing wrong with my unit test? 但是,我的单元测试出了什么问题?

Service code 服务编号

getTrackerData(): (Observable<any>) {
    return Observable.of(tracker)
        .do(data => console.log('trackerdata', data))
        .catch(this.handleError)
}

private handleError(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
}

} }

DATA 数据

const tracker =
[{
    "tracker": "2278474849", "task": 1, "agent": 1, "session": "2278474849-1-1"
 }
]

Unit Test 单元测试

/// <reference path="../../../../node_modules/@types/jasmine/index.d.ts" />
import { TestBed, fakeAsync, inject, tick, async, ComponentFixture, ComponentFixtureAutoDetect } from '@angular/core/testing';
import { MockBackend } from '@angular/http/testing'
import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'
import { BrowserModule, By } from "@angular/platform-browser";
import { ReactiveFormsModule } from '@angular/forms';
import { Observable } from 'rxjs/Rx'
import { TrackerService } from './tracker.service'


describe('tracker service', () => {

    let mockResponse, matchingItem, connection

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            providers: [
                TrackerService,
                MockBackend,
                BaseRequestOptions,
                {
                    provide: Http,
                    useFactory: (backend, defaultOptions) => new Http(backend, defaultOptions),
                    deps: [MockBackend, BaseRequestOptions]
                },
            ]
        });
        const items =
            [{
                "tracker": "2278474849", "task": 1, "agent": 1, "session": "2278474849-1-1"
            }
            ];
        mockResponse = new Response(new ResponseOptions({ body: items, status: 200 }));
    }));


    describe('getTrackerData', () => {
        //subscribe to connection and storing it later
        it('should return all items', inject([TrackerService, MockBackend], (service: TrackerService, backend: MockBackend) => {
            backend.connections.subscribe(connection => {
                connection.mockRespond(mockResponse);
            });
            service.getTrackerData() //{ "tracker": "2278474849", "task": 1, "agent": 1, "session": "2278474849-1-1"  }
                .subscribe((items: any => {
                   expect(this).toBe(2);
            }));

    })

});

I seem to be getting errors in the describe section , Problem is that I'm not used to writing javascript/angular unit test, along with mixing up a few examples in the project I'm on coupled with online examples. 我似乎在describe部分出现错误,问题是我不习惯编写javascript /角度单元测试,并且在我正在进行的项目中结合了一些示例和在线示例。

Seems like what I want/need to do should be way simple , but yet I imported so many dependencies that this is now just confusing. 似乎我想要/需要做的事情应该很简单,但是我导入了太多的依赖项,现在这很令人困惑。

Anyone know what I need to do? 有人知道我需要做什么吗?

I've been testing services by getting the service instance from the getTestBed function. 我一直在通过从getTestBed函数获取服务实例来测试服务。 Try changing your inner describe block to: 尝试将您的内部describe块更改为:

describe('getTrackerData', () => {
    it('should return all items', (done) => {
        let service: TrackerService;
        let bed = getTestBed();

          backend.connections.subscribe(connection => {
              connection.mockRespond(mockResponse);
          });

          service = bed.get(TrackerService);

          service.getTrackerData()
              .subscribe((items: any => {
                 expect(this).toBe(2);
                 done();
          }));
})

Make sure to import getTestBed from '@angular/core/testing' . 确保从'@angular/core/testing'导入getTestBed I'm also not sure you need any of these imports: 我也不确定您是否需要以下任何导入:

import { BrowserModule, By } from "@angular/platform-browser";
import { ReactiveFormsModule } from '@angular/forms';
import { Observable } from 'rxjs/Rx'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM