AngularJS-какой смысл издеваться над данными через $httpBackend?
Я только начал писать свои первые модульные тесты в AngularJS через Jasmine.
как-то я до сих пор не понимаю, почему я должен издеваться над $httpBackend. Чтобы прояснить то, что мне до сих пор непонятно, я запишу небольшой пример:
представьте, что у меня есть сервис (myService) это получение данных из URL:
function getData() {
return $http.get("http://example.com/data")
.then(function (response) {
return response.data;
});
}
предположим, что a зов к URL"http://example.com/data" возвращает следующие данные:
{
firstname: "John",
lastname: "Doe"
}
соответствующего тест будет выглядеть так:
describe("Service: myService", function () {
beforeEach(module("myApp"));
var myService, $httpBackend;
beforeEach(inject(function (_myService_, _$httpBackend_) {
myService = _myService_;
$httpBackend = _$httpBackend_;
}));
afterEach(function () {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it("should get data", function() {
var mockData = {datakey: "datavalue"};
$httpBackend.whenGET("http://example.com/data").respond(mockData);
var promise = myService.getData();
$httpBackend.flush();
promise.then(function(response){
expect(response).toEqual(mockData)
});
})
});
Если я не ошибаюсь, тест должен пройти, хотя высмеиваемые данные не равны реальным данным. Тест всегда проходит, независимо от того, как я поставил издевались данные, потому что функция всегда будет перенаправлен к тому, что находится в $httpBackend.whenGET("http://example.com/data").respond(mockData);.
Я думал, что цель такого теста-проверить, возвращаются ли данные из вызова GET [в этом случае служба MyService.getData ()] действительно ожидаемые данные, а не некоторые случайные издевались над данными. Итак, какова фактическая точка издевательства над данными вместо проверки, если myService.getData возвращает реальные данные {firstname: "John", фамилия: "Doe"}?
Я хорошо знаю, что я также могу установить издевательские данные в {firstname: "John", фамилия: "Лань"}, но когда реальные данные из URL будут динамическими, издевательские данные и реальные данные снова не будут равны.
спасибо заранее!
1 ответов
вы должны как-то различать:
- тесты
- интеграционные тесты
- сквозные тесты
что вы хотите, это модульное тестирование функции getData (). Я предполагаю, что вам все равно, верны ли данные в этом случае или нет. Что вы хотите чтобы проверить, если правильный URL-адрес вызывается.
таким образом, вы убедитесь, что этот блок вашего кода работает как ожидаемый.
рассмотрим пример:
var add = function(endpoint) {
var sum = 0;
endpoint().then(function(numberArray) {
numberArray.forEach(number) {
sum = sum + number;
}
});
return sum;
};
когда вы издеваетесь httpBackend
здесь вам на самом деле все равно, получите ли вы 1,2,3 или 5,6,7 назад. Вы хотите, чтобы убедиться, что вы добавляете любое число приходит, вы складываете их и возвращаете их.
ваш случай намного проще, поэтому вы можете проверить, является ли URL правильным, и все.
сквозной тест также будет включать в себя правильный бэкэнд и проверяет, если данные ладно.
на документация AngularJS дает понять:
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
в этом примере вы хотите убедиться, что вызываете правильный URL/endpoint. Если вы действительно получаете правильный токен, более подходит интеграционный тест или сквозной тест,который вызывает реальный бэкэнд.