У меня сейчас проект, нам нужно, чтобы сервер брандмауэра насмехался на данный момент, и мы используем $httpBackend
на приложении .run
. Мне нужно выполнить тестирование этой службы, которая содержит $httpBackend
, поскольку у нас будет огромное количество издевающихся вызовов на сервер, который мы будем покрывать. Так что прямо сейчас это то, что у меня есть. В качестве предисловия к моему вопросу текущая настройка работает, когда я вызываю mockDataService.getWorkflowTask
с контроллера на простой странице.
Мой сервер службы замены:
angular.module('app').run(function ($httpBackend, $resource, FakeBackendService) {
// TODO: add all necessary http intercepts.
$httpBackend.whenGET('JSON file').respond(function (method, url, data) {
var request = new XMLHttpRequest();
request.open('GET', url, false);
request.send(null);
return [request.status, request.response, {}];
});
$httpBackend.whenGET(/.*/).respond(function (method, url, data) {
return [200, FakeBackendService.getWorkflowTasks(), {}];
});
});
Вот сервис для FakeBackendService
:
(function() {
'use strict';
var injectParams = [];
function service(lodash) {
var vm = this;
var ret = {
getWorkflowTasks: getWorkflowTasks
};
function getWorkflowTasks() {
if (vm.workflowtasks.length < 1) {
vm.workflowtasks = loadWorkflowTasks("Some JSON file");
}
return vm.workflowtasks;
};
function loadWorkflowTasks(file) {
var workflowTasks = [];
var request = new XMLHttpRequest();
request.open("GET", file, false);
request.send(null);
if (request.status == 200) {
workflowTasks = angular.fromJson(request.response);
}
return workflowTasks;
};
function init() {
vm.workflowtasks = [];
}
init();
return ret;
}
service.$inject = injectParams;
angular.module('mock.FakeBackendService', []).service('FakeBackendService', service);
})();
Так что в настоящее время замены сервера бэкенд издеваться. Ниже приведена моя служба обработки данных, которая содержит вызов $http.get(blah blah blah)
.
(function() {
'use strict';
var injectParams = ['$http', '$q', 'mockConfigService', '$httpBackend'];
function factory($http, $q, configService, $httpBackend) {
var vm = this;
var factory = {
getWorkflowTask: getWorkflowTask
};
function getWorkflowTask(str) {
return getResource(str);
}
function init() {
// Get the URL we will be using to get data from
vm.dataServiceURL = configService.getDataServiceURL();
}
function getResource(baseResource) {
var resource = vm.dataServiceURL + baseResource;
return $http.get(resource).then(function (response) {
if (typeof response.data == 'object') {
// Got valid response
return $q.resolve(response.data);
}
else {
// Invalid response
return $q.reject(response.data);
}
}, function (response) {
// Something went wrong
return $q.reject(response.data);
});
}
init();
return factory;
};
factory.$inject = injectParams;
angular.module('mock.dataService', []).factory('mockDataService', factory);
}());
Теперь для испытания единицы жасмина-кармы.
describe("HTTP Backend Mock testing", function() {
beforeEach(angular.mock.module("app"));
beforeEach(angular.mock.module("mock.FakeBackendService"));
beforeEach(angular.mock.module("mock.configService"));
beforeEach(angular.mock.module("mock.dataService"));
it("Get the workflow task", angular.mock.inject(function (mockDataService) {
var valid = "";
var promise = mockDataService.getWorkflowTask('http://localhost/foo');
promise.then(function (response) {
valid = "Success";
}, function (response) {
valid = "Failure";
});
expect(valid).toBe("Success");
}));
});
Теперь на вопрос. Итак, я начну с того, что я новичок в мире AngularJS и, тем более, с Жасмин. В любом случае, когда я отлаживаю модульный тест, я нахожу, что статус обещания по-прежнему равен 0, и я всегда ожидаю, что '' будет «Успехом», сказав, что я никогда не разрешаю (надеюсь, что я использую правильный жаргон) обещание от службы $http
в mockDataService
. Я попытался поиграть с ним и попытался выяснить, не сделал ли кто-нибудь подобное раньше. Я нашел множество примеров, где $httpBackend
издевается над тестом, но ни один из них не подходит, как я пытаюсь. Любые идеи или предложения были бы замечательными. Благодарю.
EDIT получил немного рабочего раствора
Так что я решил, что я по скоротать run()
обслуживание и просто сделать тот же ответ в expectGET().respond()
.
describe("HTTP Backend Mock testing", function() {
beforeEach(angular.mock.module("app"));
beforeEach(angular.mock.module("mock.FakeBackendService"));
beforeEach(angular.mock.module("mock.configService"));
beforeEach(angular.mock.module("mock.dataService"));
it("Get the workflow task", angular.mock.inject(function (mockDataService, $httpBackend, FakeBackendService) {
var valid = "";
$httpBackend.expectGET('http://server:80/api/foo').respond(200, FakeBackendService.getWorkflowTasks());
var promise = mockDataService.getWorkflowTask('foo');
promise.then(function (response) {
valid = "Success";
}, function (response) {
valid = "Failure";
});
$httpBackend.flush();
expect(valid).toBe("Success");
}));
});
Этот вид решает мою проблему тестирования с run()
как цель состояла в том, чтобы проверить 1) Это согласование регулярных выражений вызова правильный FakeBackendService
и 2) То, что FakeBackendService
возвращает правильный файл и на самом деле загружает его. Я думаю, что могу сделать это, подражая тому же регулярному выражению в expectGET
. Тем не менее, я останусь открытым, чтобы узнать, знает ли кто, как заставить run()
работать.
Я попробовал, и я получаю ошибку: Неожиданный запрос: GET HTTP: // бла-бла-бла Нет больше просьба ожидать – DarkLazar
прогресс ... теперь перед вызовом mockDataService.getWorkflowTask (... ..) положил $ httpBackend.expectGET (бла-бла-бла); – Austin
Я ценю это Остин, я пробовал, и я получаю ошибку: никакого ответа не было определено! – DarkLazar