2013-08-11 2 views
8

jasmine 및 angularJS로 코드를 테스트하는 방법을 이해하려고합니다. 필자는 컨트롤러와 주입 된 서비스로 테스트 프로젝트를 작성했습니다. 이제 컨트롤러를 테스트하고 주입 된 서비스를 모의하려고했습니다. 그러나 나는 컨트롤러에서 "Arrived"기능을 테스트하는 방법을 찾지 못했습니다. http://jsfiddle.net/2fwxS/jasmine을 사용하여 angularJS 안에 주입 된 서비스가있는 컨트롤러 테스트

controller.js :

angular.module('myApp.controllers', []) 
    .controller('MyCtrl', ['$scope', 'MyService', function ($scope, MyService) { 
    $scope.User = {}; 
    $scope.HasUserArrived = false; 
    $scope.Arrived = function(firstname, lastname) { 
    $scope.HasUserArrived = MyService.Arrive(firstname, lastname); 
    return $scope.HasUserArrived; 
    } 
}]); 

services.js : 여기 내 jsfiddle의

var myApp = angular.module('myApp.services', []). 
    value('version', '0.1'); 

myApp.factory('MyService', [function() { 
    return { 
     HasArrived: false, 
     Arrive: function (firstname, lastname) { 
      this.HasArrived = false; 

      if (firstname && lastname) { 
       this.HasArrived = true; 
      } 

      console.log("User has arrived: " + this.HasArrived); 
      return this.HasArrived; 
     } 
    } 
}]); 

나는 $이 될 수 제공하는 몇 가지 유사한 설명을 발견 올바른 해결책 (How can I write jasmine test for angular controller and service like this?) 또는 createSpy (How do you mock Angular service that is a function?)하지만 $ provider.factory 또는 $ provider.value가 필요한 시점을 이해할 수 없거나 언제 createSpy를 사용해야합니까?

누군가가 나에게 차이를 이해하는 데 도움이하고 실행 내 jsFiddle ( http://jsfiddle.net/2fwxS/) 예를 비활성화 코드를 얻을 수 있다면 감사하겠습니다

...

답변

10

다음을 교체하기 위해 $provide.value를 사용해야합니다 조롱 하나 원래의 서비스 인스턴스 : $provide.value 작동하지만 $provide.factory하지 않는 이유

beforeEach(module(function($provide) { 
    var service = { 
     Arrive: function (firstname, lastname) { 
      if (firstname && lastname) { 
       return true; 
      } 
     } 
    }; 
    $provide.value('MyService', service); 
})); 

난 정말 모르겠어요. 각도 코드를 나중에 살펴보고 알아낼 수 있도록 노력하겠습니다. 뭔가를 발견하면이 답변을 업데이트하겠습니다.

스파이에 관해서는, 당신이 당신의 모의이 그들이 의도 한대로 사용되고 있는지 테스트하고 싶다면 그들을 사용해야합니다. 여기에는 매개 변수와 호출 검사가 포함됩니다. 스파이를 사용하도록 코드가 변경되었습니다.

it('checks that Arrived is correctly used', function() { 
    // Arrange 
    spyOn(service, 'Arrive'); 

    // Act 
    scope.Arrived('Franz', 'Kafka'); 

    // Assert 
    expect(service.Arrive).toHaveBeenCalledWith('Franz', 'Kafka'); 
}); 

여기에 고정 jsFiddle이 있습니다.

+0

죄송합니다. @Michael 답변과 수정 된 jsFiddle을 보내 주셔서 감사합니다. 그 작은 변화로 나는 성공적으로 테스트를 실행할 수있었습니다! 실제로 공장이 작동하지 않는 이유를 알고있는 것이 좋을 것입니다. – burgerS

+0

그리고 내 동료와 나는이 예에서 서비스를 조롱하는 대신 서비스를 테스트 할 수있는 방법이 있다면 관심이 있습니다. 우리는 서비스를 개별적으로 테스트해야한다는 것을 알고 있지만이 예제에서 서비스를 테스트 할 수 있는지 궁금해하고 있습니다 ... – burgerS

+1

서비스가 매우 간단하고 컨트롤러를 테스트 할 수 있도록 서비스를 조롱 할 수 있습니다. 그 행동을 안전하게 예측하여 서비스 구현의 오류로 인해 컨트롤러 테스트를 위반할 확률을 최소화합니다. 하지만 그렇게한다면 서비스가 아닌 컨트롤러를 테스트하게 될 것입니다. 서비스를 별도로 테스트하여 정상적으로 작동하는지 확인할 수 있습니다. –

관련 문제