2013-07-09 16 views
69

Tôi đang cố gắng kiểm tra mã bộ điều khiển đơn vị bên trong một mô-đun có các mô-đun khác làm phụ thuộc, nhưng không thể tìm ra cách mô phỏng chúng đúng cách.Các phụ thuộc mô-đun nhại trong các thử nghiệm đơn vị Jasmine

Tôi đang sử dụng Khung công tác Jasmine và chạy thử nghiệm của mình với Karma (Testacular).

Mô-đun Mã

var app = angular.module('events', ['af.widgets', 'angular-table']); 

app.controller('eventsCtrl', function([dependencies]){ 
    $scope.events = []; 
    ... 
}); 

Spec Mã

describe('events module', function(){ 
    var $scope, 
     ctrl; 

    beforeEach(function(){ 
     angular.mock.module('af.widgets', []); 
     angular.mock.module('angular-table', []); 
     module('events', ['af.widgets', 'angular-table']); 
    }); 

    beforeEach(inject(function($rootScope, $controller){ 
     $scope = $rootScope.new(); 
     ctrl = $controller('NameCtrl', { 
      $scope: $scope, 
     }); 
    })); 

    it('should have an empty events array', function(){ 
     expect($scope.events).toBe([]); 
    }) 
}); 

Các lỗi tôi nhận được là Karma là "không af.widgets mô-đun", do đó rõ ràng là tôi không chế giễu các phụ thuộc mô-đun đúng. Bất kỳ gợi ý nào?

+1

$ phạm vi = $ rootScope.new(); nên là $ scope = $ rootScope. $ new(); (có thể cho phiên bản của chúng tôi) –

Trả lời

60

Nếu bạn muốn mô phỏng mô-đun khai báo một hoặc nhiều dịch vụ tôi ha đã sử dụng mã này:

beforeEach(function(){ 
    module('moduleToMock'); 
    module(function ($provide) { 
     $provide.value('yourService', serviceMock); 
    }); 
}); 

Điều này rất hữu ích nếu dịch vụ bạn muốn thử cũng là dịch vụ mà bạn muốn kiểm tra đơn vị (trong mô tả hoa nhài khác). Giải pháp được đề xuất bởi fscof là tốt nhưng bạn không thể tạo thử nghiệm đơn vị cho mô-đun angular-table.

+4

Đây là cách phù hợp. Bởi vì bạn thường không muốn sử dụng một mô hình cho tất cả các bài kiểm tra. Se cũng ở đây: http://stackoverflow.com/a/18756347/1105860 –

+0

Được phân bổ. Điều này là chính xác hơn. – dgtc

+0

Và nếu tôi muốn đặt 'serviceMock' trong một tệp khác, không khai báo biến toàn cầu? –

44

Đây là những gì tôi đã tìm ra:

tôi đã không tải module bất kỳ 'góc bàn' trong tập tin karma.conf.js của tôi, vì thế mà lỗi. Điều này đã được cố ý lúc đầu tiên như tôi muốn thử nghiệm mô-đun 'sự kiện' mà không có mô-đun bảng thực tế.

tôi đã có thể dễ dàng chế giễu các 'góc bàn' mô-đun bằng cách tạo một file mới trong thư mục thử nghiệm của tôi gọi là 'mocks/góc-table.js' và thêm vào đoạn mã sau:

/mocks/góc-table.js

'use-strict'; 
angular.module('angular-table', []); 

tôi đã thêm file này để tập karma.conf.js của tôi, cùng với mô-đun thực 'sự kiện' tôi muốn để kiểm tra:

karma.conf.js

... 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    'scripts/libs/angular.js', 
    'scripts/libs/angular-mocks.js', 
    'scripts/events.js', // this is the real module. 
    'scripts/mocks/*.js', //loads all custom mocks. 
    'scripts/specs/*.spec.js' // loads my spec file. 
] 
... 

Cuối cùng trong file spec của tôi, tôi đã có thể thêm cả các module bằng cách gọi chúng riêng rẽ trong một khối beforeEach:

số kỹ thuật/events.spec.js

beforeEach(function(){ 
    module('angular-table'); 
    module('events'); 
}); 

tôi có ý tưởng cấu trúc tệp của tôi theo cách này từ this post

+2

Bạn không chế nhạo mô-đun 'góc-bảng' bằng cách gọi angular.module? Tôi nghĩ rằng bạn muốn gọi mô-đun, như angular-mocks gắn nó vào phạm vi toàn cầu? Ở một trong hai tỷ lệ, cảm ơn bạn vì điều này đã giúp tôi có được thông số kỹ thuật của tôi và chạy. – phillyslick

+0

"Tôi đã có thể dễ dàng giả lập mô-đun 'góc-bảng' bằng cách tạo một tệp mới trong thư mục thử nghiệm của tôi có tên 'mocks/angular-table.js' và thêm mã sau đây: /mocks/angular-table.js " –

+0

@fscof Liên kết đang đưa ra 404. – Lucio

3

Gần đây tôi đã phát hành ngImprovedTesting nên thực hiện thử nghiệm mô hình theo cách AngularJS dễ dàng hơn.

Trong trường hợp của bạn chỉ cần sử dụng sau đây trong kiểm tra Jasmine của bạn:

beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build()); 

Để biết thêm thông tin về ngImprovedTesting kiểm tra bài của mình giới thiệu blog: http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/