Служба тестирования: разница между методом MockBackend и методом spyOn(). And.returnValue()
Эти два теста, кажется, работают (по крайней мере, в моем случае)
Существуют ли какие-то конкретные различия между этими двумя методами? И как решить, что мне следует использовать (лучшие практики для тестирования службы с использованием 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']);
});
}));
1 ответ
Использовать MockBackend
потому что могут быть и другие вещи, которые вы, вероятно, должны также проверить, например, что URL-адрес правильный, что добавлены правильные заголовки и т. д. Все эти вещи можно получить из Request
от MockConnection
TestBed.get(MockBackend).connections
.subscribe((connection: MockConnection) => {
const request = connection.request;
expect(request.url).toBe(...)
})
);
Это вещи, которые вы должны проверить, так как наличие неожиданного URL приведет к сбою запроса в приложении. Таким образом, вы должны проверить это. Как и заголовки, и все остальное, что имеет отношение к запросу.