В Angular все, кажется, имеет крутую кривую обучения, а модульное тестирование приложения Angular определенно не ускользает от этой парадигмы.
Когда я начал работу с TDD и Angular, я чувствовал, что тратил дважды (возможно, больше) столько времени, сколько выяснил, как тестировать и, возможно, даже более точно настроить мои тесты правильно. Но как Ben Nadel помещал его в свой блог, в процессе обучения Angular происходят взлеты и падения. Его график, безусловно, мой опыт работы с Angular.
Однако по мере того, как я прогрессировал в процессе обучения Angular и модульного тестирования, теперь я чувствую, что я трачу гораздо меньше времени на установление тестов и гораздо больше времени, чтобы тесты проходили от красного до зеленого - что является хорошим чувством.
Итак, я столкнулся с различными методами настройки unit test для издевательства сервисов и promises, и я подумал, что поделился бы тем, что узнал, а также задал вопрос:
Есть ли какие-либо другие или лучшие способы для этого?
Таким образом, на код, что все мы все пришли сюда, чтобы не слушать кого-то, кто говорит о своей любви, совершает ошибки, изучая рамки.
Вот как я начал издеваться над моими услугами и promises, я буду использовать контроллер, но службы и promises могут быть издевательскими в других местах, очевидно.
describe('Controller: Products', function () {
var//iable declarations
$scope,
$rootScope,
ProductsMock = {
getProducts: function () {
} // There might be other methods as well but I'll stick to one for the sake of consiseness
},
PRODUCTS = [{},{},{}]
;
beforeEach(function () {
module('App.Controllers.Products');
});
beforeEach(inject(function ($controller, _$rootScope_) {
//Set up our mocked promise
var promise = { then: jasmine.createSpy() };
//Set up our scope
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
//Set up our spies
spyOn(ProductsMock, 'getProducts').andReturn(promise);
//Initialize the controller
$controller('ProductsController', {
$scope: $scope,
Products: ProductsMock
});
//Resolve the promise
promise.then.mostRecentCall.args[0](PRODUCTS);
}));
describe('Some Functionality', function () {
it('should do some stuff', function () {
expect('Stuff to happen');
});
});
});
Для нас это сработало, но со временем я подумал, что должен быть лучший способ. Для одного я ненавидел
promise.then.mostRecentCall
и если бы мы хотели повторно инициализировать контроллер, нам пришлось вытащить его из блока beforeEach и вставить его в каждый тест.
Должен быть лучший способ...
Теперь я спрашиваю, есть ли у кого-нибудь другие способы тестирования тестов или мысли или чувства по тому, как я решил это сделать?