2013-08-11 27 views
8

ile angularJS içinde enjekte servis ile test denetleyicisi Kodumu jasmine ve angularJS ile nasıl test edeceğimi anlamaya çalışıyorum. Bir kontrolör ve enjekte edilmiş bir servis ile bir test projesi yazdım. Şimdi kontrolörü test etmek ve enjekte edilen servis ile dalga geçmek istedim. Ancak, kontrol cihazımdan “Gelen” fonksiyonunu test etmenin bir yolunu bulamadım. http://jsfiddle.net/2fwxS/Jasmine

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: İşte benim jsfiddle var

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; 
     } 
    } 
}]); 

Ben $ olabilir sağlamak bazı benzer açıklamalarda bulundu doğru çözüm (How can I write jasmine test for angular controller and service like this?) veya createSpy (How do you mock Angular service that is a function?) ancak $ provider.factory veya $ provider.value gereksinim duyduğumda ya da createSpy'yi ne zaman kullanmalıyım?

biri bana farklılıkları anlamaya yardımcı ve hemen çalıştırmaktır benim jsFiddle ( http://jsfiddle.net/2fwxS/) örneğe devre dışı kod alır eğer ben takdir ediyorum

...

cevap

10

Sen değiştirmek amacıyla $provide.value kullanmalıdır bir alay biriyle orijinal servis örneği: $provide.value çalışır ancak $provide.factory değil neden

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

gerçekten bilmiyorum. Angular kodunu daha sonra inceleyeceğim, böylece anlayabiliyorum. Bir şey öğrenirsem bu cevabı güncellerim.

Casuslar hakkında, alaylarınızın söz konusu oldukları şekilde kullanıldığını test etmek isterseniz bunları kullanmalısınız. Bu kontrol parametreleri ve çağrıları içerir.

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

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

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

İşte senin sabit jsFiddle var: Burada bir casus kullanmak değişti senin kod.

+0

Geç yanıt için özür dilerim! @Michael Cevap ve düzeltilmiş jsFiddle için teşekkür ederiz. Bu küçük değişikliklerle testlerimi başarılı bir şekilde yürüttüm! Gerçekten de fabrikanın neden çalışmadığını bilmek güzel olurdu. – burgerS

+0

Ve meslektaşım ve ben de hizmetin alay etmek yerine bu örnek içinde hizmeti sınamanın bir yolu varsa ilgileniyoruz. Servisimizi ayrı ayrı test etmemiz gerektiğini biliyoruz ancak buradaki servisin test edilip edilmeyeceğini merak ediyorduk ... – burgerS

+1

Servis çok basitse kontrol cihazını test etmek için servisle alay edebilirsiniz. Davranışını güvenli bir şekilde tahmin eder, böylece servis uygulamasındaki bir hatadan dolayı kontrolör testlerinin kırılma olasılığını en aza indirir. Ancak, bunu yaparsanız, denetleyiciyi değil, hizmeti test edeceksiniz. Hizmeti ayrı olarak test etmelisiniz, böylece çalışacak şekilde çalışmasını sağlayabilirsiniz. –