繁体   English   中英

角单元测试服务

[英]Angular unit testing a service

我正在努力测试一项简单的服务。 我找不到确切要测试的内容。

@Injectable()
export class MyService {
    constructor(
        private firstService: FirstService,
        private secondService: SecondService) {
    }

    deals(body: myModel): Observable<any> {
        let url = this.secondService.makeUrl('/api/deals');
        return this.firstService.post(url, body);
    }

}

myModel就像:

export class myModel {
    meta: otherModel;
    data: any;
}  

this.secondService.makeUrl()返回urlthis.firstService.post()实际上是http.post请求。

问题是我不知道如何测试deals方法。 我嘲笑FirstServiceSecondService例如

mockFirstService = jasmine.createSpyObj(["post"]);

beforeEach (TestBed.configureTestingModule etc)里面一切都很好,但是我不知道到底要添加什么

 it(...)

我到底要测试什么?如何测试?

如果我要按照问题中的详细说明在“ MyService”中测试Deals方法,我将模拟并扩展两个依赖项,就像您提到的那样,然后更改这些依赖项的结果,并确保要使用所有测试用例帐户正在工作。 由于您没有任何错误检查,因此我不会对此进行测试-尽管您确实想在某处(例如在服务中)进行错误检查。 我至少看到三个测试:检查发送给FirstService的调用和参数,检查对SecondService的调用以及返回Observable。

我已经设置了一个测试stackblitz来在这里演示: https ://stackblitz.com/edit/stackoverflow-q-53102348?file = app%2Fmy.service.spec.ts

这是该堆栈闪电中的MyService描述:

describe('MyService', () => {
    let myService: MyService;
    let mockFirstService = jasmine.createSpyObj('FirstService', {
        post: of({results: 'Ok'})
    });
    let mockSecondService = jasmine.createSpyObj('SecondService', {
        makeUrl: '/api/deals'
    });

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [/* any imports needed */],
            providers: [MyService,
            { provide: FirstService, useValue: mockFirstService }, 
            { provide: SecondService, useValue: mockSecondService }
            ]
        });
        myService = TestBed.get(MyService);
    });

    it('should be createable', () => {
        expect(myService).toBeTruthy();
    });
    describe('deals() method', () => {
        const testData: myModel = { meta: {}, data: 'test' };

        it('should call secondService.makeUrl()', () => {
            myService.deals(testData);
            expect(mockSecondService.makeUrl).toHaveBeenCalled();
        });
        it('should call firstService.post() with an url and a myModel', () => {
            myService.deals(testData);
            expect(mockFirstService.post).toHaveBeenCalledWith('/api/deals', testData);
        });
        it('should return an Observable that resolves properly', () => {
            mockFirstService.post.and.returnValue(of({results: 'Good'})); // Change return
            myService.deals(testData).subscribe(data => {
                expect(data).toEqual({results: 'Good'});
            })
        });

    });
});

暂无
暂无

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

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