Я использую MockBackend
для проверки кода, который зависит от @angular/http
.
Все примеры вокруг сети используют асинхронный испытательную установку, как здесь:
thoughtram: Testing Services with Http in AngularУгловое: тестирование HTTP с помощью MockBackend, асинхронно() действительно требуется?
describe('getVideos()',() => {
it('should return an Observable<Array<Video>>',
async(inject([VideoService, MockBackend], (videoService, mockBackend) => {
videoService.getVideos().subscribe((videos) => {
expect(videos.length).toBe(4);
expect(videos[0].name).toEqual('Video 0');
expect(videos[1].name).toEqual('Video 1');
expect(videos[2].name).toEqual('Video 2');
expect(videos[3].name).toEqual('Video 3');
expect("THIS TEST IS FALSE POSITIVE").toEqual(false);
});
const mockResponse = {
data: [
{ id: 0, name: 'Video 0' },
{ id: 1, name: 'Video 1' },
{ id: 2, name: 'Video 2' },
{ id: 3, name: 'Video 3' }
]
};
mockBackend.connections.subscribe((connection) => {
connection.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify(mockResponse)
})));
});
})));
});
Однако, я попробовал, что, и я уверен, что MockBackend выполняет полностью синхронны:
describe('getVideos()',() => {
it('should return an Observable<Array<Video>>',
inject([VideoService, MockBackend], (videoService, mockBackend) => {
const mockResponse = {
data: [
{ id: 0, name: 'Video 0' },
{ id: 1, name: 'Video 1' },
{ id: 2, name: 'Video 2' },
{ id: 3, name: 'Video 3' },
]
};
mockBackend.connections.subscribe((connection) => {
connection.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify(mockResponse)
})));
});
let videos;
videoService.getVideos().subscribe(v => videos = v);
// synchronous code!?
expect(videos.length).toBe(4);
expect(videos[0].name).toEqual('Video 0');
expect(videos[1].name).toEqual('Video 1');
expect(videos[2].name).toEqual('Video 2');
expect(videos[3].name).toEqual('Video 3');
}));
});
Я создал полный пример на plunker здесь: https://plnkr.co/edit/I3N9zL?p=preview
Что-то, должно быть, было изменено с тех пор, как были написаны эти статьи. Может ли кто-нибудь указать мне на это нарушение? Или я пропустил важный факт?
Изменение тестовых проходов и передача их по-прежнему не всегда полезны. Что произойдет, если вы выполните тест * failing * с использованием 'async' и удалите этот вызов? Он все еще терпит неудачу? – jonrsharpe
Первый пример в основном неправильный, 'ожидать (« ЭТО ТЕСТИРОВАНИЕ ЛОЖНО ПОЗИТИВНО »). ToEqual (false);' никогда не должно быть зеленым. он будет работать, если код будет работать async. но это не так. –
Я предлагаю, чтобы *** mockResponse *** был синхронным, но *** MockConnection *** не кажется синхронным. Я добавил второй тест для каждого теста (уменьшив его до 2-х видео, а синхронный с ошибкой и асинхронный переход. –