2015-02-06 3 views
0

Я хотел бы знать, какой будет лучший способ тестирования функций, которые ничего не возвращают (просто изменяет значение поля) и содержат асинхронный вызов.Жасмин: тестовая функция void, содержащая асинхронный вызов

Этот контроллер в AngularJS я хочу проверить, сервис я называю возвращает обещание (всегда возвращает {имя: «Джон»}):

app.controller('MyCtrl', function($scope, AsyncService) { 

    $scope.greeting = ""; 
    $scope.error = 

    $scope.sayHello = function() { 

    AsyncService.getName().then(
     function(data){ 
      $scope.saludo = "Hello " + data.name; 
     }, 
     function(data){ 
       $scope.error = data; 
     } 
    ); 

    }; 

}); 

Это будет спецификация, если функция SayHello не содержат асинхронный вызов, но он всегда терпит неудачу, поскольку scope.greeting всегда пуст.

describe('Test My Controller', function() { 

    var scope, $httpBackend; 

    // Load the module with MainController 
    //mock Application to allow us to inject our own dependencies 
    beforeEach(angular.mock.module('app')); 

    //mock the controller for the same reason and include $rootScope and $controller 
    beforeEach(angular.mock.inject(function($rootScope, $controller,_$httpBackend_){ 

     //Mock the service to always return "John" 
     $httpBackend = _$httpBackend_; 
     $httpBackend.when('POST', 'http://localhost:8080/greeting').respond({name: "John"}); 

     //create an empty scope 
     scope = $rootScope.$new(); 
     //declare the controller and inject our empty scope 
     $controller('MyCtrl', {$scope: scope}); 
    })); 

    it('$scope.greeting should get filled after sayHello', function() { 
    expect(scope.greeting).toEqual(""); 
    scope.sayHello(); 
    expect(scope.greeting).toEqual("Hello John"); 
    });*/ 

}); 

Как я могу использовать эту спецификацию для обработки асинхронного вызова? Я действительно не понимаю, как и где использовать флаг «done» Jasmine 2.0.

+0

Дублировать [http://stackoverflow.com/questions/21323996/angularjs-test-scope-methods-that-make-async-calls](http://stackoverflow .com/вопросы/21323996/angularjs-тест-Scope методы, которые делают-Асинхр-звонки) – razvanz

ответ

1

Используйте $ q.defer(), чтобы вернуть обещание функции getName в макет вашего сервиса. Затем пройти издевался в зависимости, когда создаются контроллер:

beforeEach(inject(function($controller, _$rootScope_, $q) { 
    $rootScope = _$rootScope_; 
    deferred = $q.defer(); 

    asyncService = { 
     getName: function() { 
     } 
    }; 

    spyOn(asyncService, 'getName').and.returnValue(deferred.promise); 

    $scope = $rootScope.$new(); 

    createController = function() { 
     return $controller('MyCtrl', { $scope: $scope, AsyncService: asyncService }); 
    }; 
})); 

Затем после вызова $scope.hello() вызова deferred.resolve(data)l, где данные данные, которые вы хотите получить от службы в обещании. Затем вызовите $rootScope.$digest();

it('$scope.saludo should get filled after sayHello', function() { 
    //Arrange 
    var controller = createController(); 
    var data = { 
     name: 'John' 
    }; 

    //Act 
    $scope.sayHello(); 
    deferred.resolve(data); 
    $rootScope.$digest(); 

    //Assert 
    expect($scope.saludo).toEqual('Hello ' + data.name); 
}); 

Plunkr

Смежные вопросы