2017-11-15 33 views
5

Tôi có một chức năng như thế nàyMã bảo hiểm cho phản ứng thành công cuộc gọi dịch vụ trong nghiệp

$scope.openMail=function(mail){ 
     DocumentTypes.getDocument(function(response){ 
      $scope.documentTypes=response.result; 
      $log.log("documentTypes",$scope.documentTypes); 
      }) 
} 

Spec cho vui trên là

it("should test open mail", function(){ 
    scope.documentTypes=[{"type":"pdf"},{"type":"xml"}]; 
    spyOn(documentTypes,"getDocument").and.callFake(function(){ 
     return scope.documentTypes; 
    }); 
    var mail='back'; 
    scope.openMail(mail); 
    expect(scope.documentTypes).toEqual({"type":"pdf"},{"type":"xml"}); 


    }) 

nên mã không bao gồm cho function(response){}

so the code is not covering code for <code>function(response){}</code> Tôi có thể bao gồm mã này trong phạm vi mã của mình bằng cách nào? Cảm ơn.

+0

thử nghiệm của bạn là màu đỏ hoặc màu xanh lá cây? – mickaelw

+0

'DocumentTypes' được tiêm vào bạn như thế nào? Ngoài ra, vì bạn đang theo dõi hàm này, bạn có thể thử thêm 'expect (documentTypes.getDocument) .toHaveBeenCalled()' và xem nó có thực sự được gọi trong khi chạy thử nghiệm không? – mindparse

Trả lời

1

Bạn có một số vấn đề với bạn r kiểm tra:

  1. Bạn làm spyOn(documentTypes,"getDocument") thay vì spyOn(DocumentTypes,"getDocument")
  2. chức năng giả của bạn trả về một giá trị (đồng bộ) chứ không phải gọi gọi lại cung cấp (không đồng bộ)
  3. Bạn bắt đầu bằng cách khởi tạo scope.documentTypes đến kết quả mong đợi của thử nghiệm, ví dụ: kiểm tra vượt qua bất kể mã nào có hiệu lực (trừ khi bạn nhận được ngoại lệ)
  4. Thêm sự cố với mã của bạn - Hàm bạn đang thử nghiệm không có gì với tham số mail nhập

Đây là cách tôi sẽ kiểm tra nó:

describe('$scope.openMail', function() { 
    beforeEach(function() { 
     spyOn(DocumentTypes, 'getDocument'); 
    }); 

    it('uses DocumentTypes.getDocument service to get the document types', function() { 
     $scope.openMail('test_mail'); 

     expect(DocumentTypes.getDocument).toHaveBeenCalledWith(jasmine.any(Function)); 
    }); 

    describe('provides a callback function that', function() { 
     beforeEach(function() { 
      DocumentTypes.getDocument.and.callFake(function (callback) { 
       callback('test_document_types'); 
      }); 
     }); 

     it('stores the document types on the scope', function() {   
      $scope.openMail('test_mail'); 

      expect($scope.documentTypes).toEqual('test_document_types'); 
     }); 

     // Note: This is optional, depending on whether you test logging or not 
     it('logs the document types', function() {   
      spyOn($log, 'log'); 

      $scope.openMail('test_mail'); 

      expect($log.log).toHaveBeenCalledWith('documentTypes', 'test_document_types'); 
     }); 
    }); 
}); 
+0

Cảm ơn u rất nhiều, Nó hoạt động. u có thể gợi ý cho một cuộc gọi dịch vụ trong đó có thông số như sau cách 'EmailStatus.unlockEmailStatus ({ "emailStatusDetail": unlockEmailStatusDetail}, function (response) {$ log.log ("updateUnlockEmailStatus", phản ứng); ' – ramana

+0

Thank u bạn có thể đề xuất một testcase cho một cuộc gọi dịch vụ có tham số như sau: 'EmailStatus.unlockEmailStatus ({"emailStatusDetail": unlockEmailStatusDetail}, chức năng (phản hồi) {$ log.log ("updateUnlockEmailStatus", phản hồi); }); ' – ramana

+0

Bạn đang cố gắng kiểm tra chính xác? Hàm 'unlockEmailStatus'? – eitanfar

0

tôi có thể là hoàn toàn sai ở đây, nhưng nếu đó là lời kêu gọi DocumentTypes.getDocument (...) là một cuộc gọi async bạn có thể cần phải kích hoạt một chu kỳ tiêu hóa bằng cách gọi scope.apply() ngay sau khi bạn gọi scope.openMail(mail)

+0

chúng tôi đã thử 'phạm vi. $ Áp dụng()' nhưng không có thay đổi trong phạm vi mã – ramana

0

Giả sử bạn đang đưa DocumentTypes vào bộ điều khiển của bạn hoặc bất cứ điều gì bạn có chức năng openMail đó, bạn có thể giả lập nó khi thực hiện kiểm tra. Một cách để làm điều đó có thể là sử dụng dịch vụ $ cung cấp.

giả này có thể xem như thế này nếu sử dụng nghiệp-chai-gián điệp:

stubs = { 
    DocumentTypes: { 
     getDocument: chai.spy(function(callback) 
     { 
      callback({ 
       result: [ 
        "type" 
       ] 
      }); 
     }) 
    } 
}; 

Sau đó cung cấp cho nó sử dụng $ cung cấp trong các thử nghiệm đơn vị của bạn:

beforeEach(function() 
{ 
    module(function($provide) 
    { 
     $provide.value("DocumentTypes", stubs.DocumentTypes); 
    }); 
}); 

Các thử nghiệm bản thân thì có thể giống như thế này bằng cách sử dụng karma-mocha và karma-chai:

it("should test open mail", function() 
{ 
    var controller = $controller('myController', { 
     $scope: stubs.$scope 
    }); 

    stubs.$scope.openMail("mail"); 

    expect(stubs.$scope.documentTypes).to.deep.equal([ 
     "type" 
    ]); 
    expect(stubs.DocumentTypes.getDocument).to.have.been.called.once(); 
}); 
Các vấn đề liên quan