2017-11-15 94 views
5

mam funkcję jak tenpokrycie kodu dla call service odpowiedzi Sukces w karmie

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

spec powyżej zabawy jest

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


    }) 

więc kod nie jest przykrycie dla function(response){}

so the code is not covering code for <code>function(response){}</code> Jak mogę pokryć ten kod w moim zasięgu kodu? Dzięki.

+0

Twój test jest czerwony lub zielony? – mickaelw

+0

W jaki sposób jest wstrzykiwany test "DocumentTypes"? Ponadto, ponieważ szpiegujesz tę funkcję, czy możesz spróbować dodać 'expect (documentTypes.getDocument) .toHaveBeenCalled()' i sprawdzić, czy jest on rzeczywiście wywoływany podczas testu? – mindparse

Odpowiedz

1

Masz kilka problemów z sobą Test r:

  1. Robisz spyOn(documentTypes,"getDocument") zamiast spyOn(DocumentTypes,"getDocument")
  2. swojej fałszywej funkcja zwraca wartość (synchroniczne) zamiast zadzwonić dostarczonego zwrotnego (asynchroniczny)
  3. Zaczynasz poprzez inicjowanie scope.documentTypes do oczekiwanego wyniku test, tzn. test przechodzi bez względu na to, co robi kod (chyba, że ​​dostaniesz wyjątek)
  4. Większy problem z twoim kodem - funkcja, którą testujesz, nic nie robi z wprowadzonym parametrem mail parametr

Oto jak bym go przetestować:

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

Dziękuję bardzo, działa. można sugerować dla wywołania usługi, który ma parametr podobny do następującego: 'EmailStatus.unlockEmailStatus ({" emailStatusDetail ": unlockEmailStatusDetail}, funkcja (odpowiedź) {$ log.log (" updateUnlockEmailStatus ", odpowiedź);' – ramana

+0

Dziękuję bardzo, działa. może sugerować testcase dla zgłoszenia serwisowego, które ma parametr podobny do następującego: 'EmailStatus.unlockEmailStatus ({"emailStatusDetail": unlockEmailStatusDetail}, funkcja (odpowiedź) {$ log.log ("updateUnlockEmailStatus", odpowiedź); }); ' – ramana

+0

Co próbujesz dokładnie przetestować? Funkcja 'unlockEmailStatus'? – eitanfar

0

mogę tu być całkowicie błędne, ale jeśli to wezwanie do DocumentTypes.getDocument (...) jest wywołanie asynchroniczne może trzeba wywołać cykl digest wywołując scope.apply() tylko po wywołaniu scope.openMail(mail)

+0

próbowaliśmy 'scope. $ Apply()' ale nie ma zmiany w zasięgu kodu – ramana

0

Zakładając cię wstrzykiwać DocumentTypes do kontrolera lub cokolwiek masz tę funkcję OpenMail, możesz wyśmiewać go podczas wykonywania testów. Jednym ze sposobów na to może być skorzystanie z usługi $ provide.

Ta makieta może wyglądać tak w przypadku korzystania karma-chai-szpiegów:

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

następnie dostarczyć go za pomocą $ przewidują w swoich testach jednostkowych:

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

Test sama mogłaby wtedy wyglądać w ten sposób używając karma-mocha i 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(); 
});