2013-08-11 53 views
8

Tôi đang cố gắng hiểu cách kiểm tra mã của mình bằng hoa nhài và angularJS. Tôi đã viết một dự án thử nghiệm với một bộ điều khiển và một dịch vụ tiêm. Bây giờ tôi muốn kiểm tra bộ điều khiển và cố gắng giả lập dịch vụ được tiêm. Nhưng tôi đã không tìm thấy một cách để kiểm tra chức năng "Đến" từ bộ điều khiển của tôi. Dưới đây là jsfiddle tôi: http://jsfiddle.net/2fwxS/Kiểm tra bộ điều khiển với dịch vụ được tiêm bên trong angularJS với hoa nhài

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:

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

tôi tìm thấy một số giải thích tương tự trong đó $ cung cấp có thể là giải pháp đúng (How can I write jasmine test for angular controller and service like this?) hoặc createSpy (How do you mock Angular service that is a function?) nhưng tôi không thể hiểu khi nào tôi cần $ provider.factory hoặc $ provider.value hoặc khi nào tôi nên sử dụng createSpy?

tôi sẽ đánh giá cao nếu ai đó có thể giúp tôi hiểu được sự khác biệt và được mã vô hiệu hóa trong jsFiddle của tôi (http://jsfiddle.net/2fwxS/) ví dụ và chạy ...

Trả lời

10

Bạn nên sử dụng $provide.value để thay thế trường hợp dịch vụ ban đầu với một chế giễu một:

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

tôi thật sự không biết tại sao $provide.value công trình nhưng $provide.factory không. Tôi sẽ cố gắng xem xét mã Angular sau để tôi có thể tìm ra nó. Tôi sẽ cập nhật câu trả lời này nếu tôi tìm ra điều gì đó.

Giới thiệu về gián điệp, bạn nên sử dụng chúng nếu bạn muốn kiểm tra xem mocks của bạn có đang được sử dụng theo cách chúng được cho là không. Điều đó bao gồm các thông số kiểm tra và lời gọi. Dưới đây là mã của bạn được thay đổi để sử dụng gián điệp:

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

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

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

Đây là số điện thoại cố định jsFiddle.

+0

Xin lỗi vì câu trả lời muộn của tôi! @Michael Cảm ơn bạn đã trả lời và jsFiddle đã sửa. Với những thay đổi nhỏ đó tôi đã có thể chạy thử nghiệm thành công! Thật vậy, thật tuyệt khi biết tại sao nhà máy không hoạt động. – burgerS

+0

Và đồng nghiệp của tôi và tôi quan tâm nếu đó cũng là một cách để kiểm tra dịch vụ bên trong ví dụ này thay vì chế nhạo dịch vụ. Chúng tôi biết chúng tôi nên kiểm tra dịch vụ riêng biệt nhưng chúng tôi đã tự hỏi nếu thử nghiệm dịch vụ bên trong ví dụ này có thể là ... – burgerS

+1

Bạn có thể loại bỏ dịch vụ để kiểm tra bộ điều khiển nếu dịch vụ rất đơn giản và bạn có thể một cách an toàn dự đoán hành vi của nó, do đó giảm thiểu tỷ lệ phá vỡ các kiểm tra bộ điều khiển vì một lỗi trong việc thực hiện dịch vụ. Nhưng, nếu bạn làm điều đó bạn sẽ được thử nghiệm bộ điều khiển, không phải là dịch vụ. Bạn vẫn nên kiểm tra dịch vụ một cách riêng biệt để bạn có thể đảm bảo nó hoạt động theo đúng cách. –