Я пытаюсь написать единичный тест для моей службы с использованием MockBackend и каждый раз, когда я получаю ответ как неопределенный. Любая помощь будет оценена по достоинству. Я проверил все эти решения ниже и по сравнению с моими, я действительно не вижу больших различий.Угловой 2: MockBackend возвращает ответ «undefined»
Вот моя служба:
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { SomeObject } from './someObject';
@Injectable()
export class SomeService {
private serviceUrl: string = 'http://localhost:8080/getObjects';
constructor(private http: Http) { }
getObjects() {
return this.http.get(this.serviceUrl)
.map((response) => response.json().content as SomeObject[])
}
}
Вот мои тесты:
import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { TestBed, tick, fakeAsync, inject } from '@angular/core/testing';
import { MockBackend } from '@angular/http/testing';
import { SomeService } from './some.service';
import { SomeObject } from './someObject';
describe('SomeServiceTest',() => {
let stubData: SomeObject[] = [
new SomeObject(1, "Title")
];
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
SomeService,
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: (backend: MockBackend, options: BaseRequestOptions) => {
return new Http(backend, options);
},
deps: [MockBackend, BaseRequestOptions]
}
]
});
});
it('should fetch data', inject([SomeService, MockBackend], fakeAsync((service: SomeService, mockBackend: MockBackend) => {
let res: SomeObject[];
mockBackend.connections.subscribe(c => {
expect(c.request.url).toBe('http://localhost:8080/getObjects');
c.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify(stubData)
})));
});
service.getObjects().subscribe((response) => {
console.log("response :: " + JSON.stringify(response)); // this is where I am seeing undefined
res = response;
});
tick();
expect(res[0].name).toBe('Title'); // this returns an exception TypeError: Cannot read property '0' of undefined
})));
});
Крепление ответ от 'response.json(). Содержание в SomeObject []' 'к response.json()' решить ее. Вторая исправленная вами проблема не является проблемой, так как вы можете видеть, что я использовал 'fakeAsync' в сочетании с' tick() ', который обрабатывает мои асинхронные вызовы. Тем не менее, я все равно буду принимать этот ответ как правильный. – Sayantan
О, я вижу, я обновлю свой ответ для дальнейшего использования! Рад, что я смог помочь. –
Большое спасибо Даниил !! Всегда помогает второй набор глаз. Я знал, что в конфигурации нет ничего плохого, и за ними всегда бывает глупая ошибка;) – Sayantan