测试服务:MockBackend 方法和 spyOn().and.returnValue() 方法的区别
Testing Service : Difference between MockBackend method and spyOn().and.returnValue() method
这两个测试似乎有效(至少在我的情况下)
这两种方法之间是否存在一些具体差异?
以及如何决定我应该使用哪个(使用 Http 测试服务的最佳实践)?
1.使用 MockBackend 方法
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
MyService,
MockBackend,
BaseRequestOptions,
{
provide: Http,
deps: [MockBackend, BaseRequestOptions],
useFactory: (backend: XHRBackend, defaultOptions: BaseRequestOptions) => new Http(backend, defaultOptions)
}
],
imports: [HttpModule]
}).compileComponents();
});
it('#getResources should get an items list',
async(inject([MyService], (service: MyService) => {
TestBed.get(MockBackend).connections.subscribe(
(connection: MockConnection) => connection.mockRespond(new Response(
new ResponseOptions({
body: {
items: ['foo','bar']
}
})
))
);
service.getResources('/foobar').subscribe(items => {
expect(items).toEqual(['foo','bar']);
});
}))
);
2。使用 spyOn().and.returnValue() 方法
let backend: XHRBackend;
let defaultOptions: BaseRequestOptions;
let http = new Http(backend, defaultOptions);
it('#getResources should get an items list', async(() => {
const spy = spyOn(http, 'get')
.and.returnValue(
Observable.of(new Response(new ResponseOptions({
body: {items: ['foo','bar']}
}))
));
let service = new MyService(http);
service.getResources('/foobar').subscribe(items => {
expect(items).toEqual(['foo','bar']);
});
}));
使用 MockBackend
因为可能还有其他你应该测试的东西,比如 URL 是否正确,是否添加了正确的 headers 等等。所有这些东西可以从Request
从MockConnection
得到
TestBed.get(MockBackend).connections
.subscribe((connection: MockConnection) => {
const request = connection.request;
expect(request.url).toBe(...)
})
);
这些是您应该测试的东西,因为意外URL会导致应用程序中的请求失败。所以你应该测试一下。以及 headers,以及与请求相关的任何其他内容。
这两个测试似乎有效(至少在我的情况下)
这两种方法之间是否存在一些具体差异? 以及如何决定我应该使用哪个(使用 Http 测试服务的最佳实践)?
1.使用 MockBackend 方法
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
MyService,
MockBackend,
BaseRequestOptions,
{
provide: Http,
deps: [MockBackend, BaseRequestOptions],
useFactory: (backend: XHRBackend, defaultOptions: BaseRequestOptions) => new Http(backend, defaultOptions)
}
],
imports: [HttpModule]
}).compileComponents();
});
it('#getResources should get an items list',
async(inject([MyService], (service: MyService) => {
TestBed.get(MockBackend).connections.subscribe(
(connection: MockConnection) => connection.mockRespond(new Response(
new ResponseOptions({
body: {
items: ['foo','bar']
}
})
))
);
service.getResources('/foobar').subscribe(items => {
expect(items).toEqual(['foo','bar']);
});
}))
);
2。使用 spyOn().and.returnValue() 方法
let backend: XHRBackend;
let defaultOptions: BaseRequestOptions;
let http = new Http(backend, defaultOptions);
it('#getResources should get an items list', async(() => {
const spy = spyOn(http, 'get')
.and.returnValue(
Observable.of(new Response(new ResponseOptions({
body: {items: ['foo','bar']}
}))
));
let service = new MyService(http);
service.getResources('/foobar').subscribe(items => {
expect(items).toEqual(['foo','bar']);
});
}));
使用 MockBackend
因为可能还有其他你应该测试的东西,比如 URL 是否正确,是否添加了正确的 headers 等等。所有这些东西可以从Request
从MockConnection
TestBed.get(MockBackend).connections
.subscribe((connection: MockConnection) => {
const request = connection.request;
expect(request.url).toBe(...)
})
);
这些是您应该测试的东西,因为意外URL会导致应用程序中的请求失败。所以你应该测试一下。以及 headers,以及与请求相关的任何其他内容。