2015-12-28 13 views
9

Tôi có một phương thức trong một dịch vụ sử dụng tính năng gỡ lỗi của gạch dưới.Kiểm tra chức năng bị lỗi trong Angular with Jasmine không bao giờ gọi hàm

Bên trong phương thức đó là cuộc gọi đến một phương thức trên một dịch vụ khác. Tôi đang cố gắng để kiểm tra rằng các dịch vụ khác nhau được gọi là.

Trong nỗ lực của tôi để kiểm tra phương pháp debounced, phương pháp dịch vụ khác nhau không bao giờ được gọi, và hoa nhài không thành công với: 'aMethod điệp viên dự kiến ​​sẽ có được gọi là'

Tôi biết một thực tế là nó được gọi là (nó đăng nhập vào giao diện điều khiển trong chrome), nó chỉ được gọi là SAU KHI kỳ vọng đã thất bại.

Vì vậy, ... (tốt nhất) mà không cần thêm Sinon hoặc phụ thuộc nhau và với
điểm thưởng * trao cho một giải pháp không cần phải xoay _.debounce vào một thời gian chờ $ ...

thế nào làm gì?

angular.module('derp', []) 
.service('herp', function(){ 
    return { 
    aMethod: function(){ 
     console.log('called!'); 
     return 'blown'; 
    } 
    }; 
}) 
.service('Whoa', ['herp', function(herp){ 
    function Whoa(){ 
    var that = this; 
    this.mindStatus = 'meh'; 
    this.getMind = _.debounce(function(){ 
     that.mindStatus = herp.aMethod(); 
    }, 300); 
    } 
    return Whoa; 
}]); 

kiểm tra:

describe('Whoa', function(){ 
    var $injector, whoa, herp; 

    beforeEach(function(){ 
    module('derp'); 
    inject(function(_$injector_){ 
     var Whoa; 
     $injector = _$injector_; 
     Whoa = $injector.get('Whoa'); 
     herp = $injector.get('herp'); 
     whoa = new Whoa(); 
    }); 
    }); 

    beforeEach(function(){ 
    spyOn(herp, 'aMethod').andCallThrough(); 
    }); 

    it('has a method getMind, that calls herp.aMethod', function(){ 
    whoa.getMind(); 
    expect(herp.aMethod).toHaveBeenCalled(); 
    }); 
}); 

Tại sao các vị thần kiểm tra góc lìa bỏ tôi?

* Tôi không biết cách cung cấp điểm thưởng thực tế trên stackoverflow, nhưng nếu có thể, tôi sẽ làm.

Trả lời

13

Bạn chỉ cần để thử phương pháp debounce lodash:

describe('Whoa', function(){ 
    var $injector, whoa, herp; 

    beforeEach(function(){ 
    module('derp'); 
    spyOn(_, 'debounce').and.callFake(function(cb) { return function() { cb(); } }); 
    inject(function(_$injector_){ 
     var Whoa; 
     $injector = _$injector_; 
     Whoa = $injector.get('Whoa'); 
     herp = $injector.get('herp'); 
     whoa = new Whoa(); 
    }); 
    }); 

    beforeEach(function(){ 
    spyOn(herp, 'aMethod').andCallThrough(); 
    }); 

    it('has a method getMind, that calls herp.aMethod', function(){ 
    whoa.getMind(); 
    expect(herp.aMethod).toHaveBeenCalled(); 
    }); 
}); 
+0

Không. Vẫn không làm việc. Trong cả hai trường hợp của chúng tôi herp.aMethod IS được gọi, nhưng không được gọi trước kỳ vọng. –

+0

Tôi ước tôi có chai như đã hứa ngay bây giờ. "cuối cùng" sẽ sửa lỗi này. –

+0

đặt điểm ngắt bên trong hàm ẩn danh bên trong cuộc gọi và kiểm tra ngăn xếp để xem nó được gọi từ đâu. – Wawy

1

góc $timeout có lợi thế trong các thử nghiệm bởi vì nó được chế giễu trong các thử nghiệm để được đồng bộ. Người ta sẽ không có lợi thế này khi sử dụng một công cụ không đồng bộ của bên thứ ba. Nói chung thông số kỹ thuật không đồng bộ sẽ giống như là:

var maxDelay = 500; 

    ... 
    it('has a method getMind, that calls herp.aMethod', function (done){ 
    whoa.getMind(); 
    setTimeout(function() { 
     expect(herp.aMethod).toHaveBeenCalled(); 
     done(); 
    }, maxDelay); 
    }); 

Kể từ gạch debounce không cung cấp flush chức năng (trong khi phiên bản gần đây của Lodash debouncedoes), thử nghiệm không đồng bộ là lựa chọn tốt nhất có sẵn.

+0

hoạt động với tôi, với thời gian chờ là 0 – dliu120

Các vấn đề liên quan