2013-04-24 12 views
84

Mam funkcję, którą chciałbym przetestować, która wywołuje zewnętrzną metodę API dwukrotnie, używając różnych parametrów. Chciałbym wyśmiewać ten zewnętrzny interfejs zewnętrzny za pomocą szpiega Jasmine i zwracać różne rzeczy na podstawie parametrów. Czy jest jakiś sposób, żeby to zrobić w Jasmine? Najlepsze, co mogę wymyślić jest hack użyciu andCallFake:Jakikolwiek sposób modyfikowania szpiegów Jasmine na podstawie argumentów?

var functionToTest = function() { 
    var userName = externalApi.get('abc'); 
    var userId = externalApi.get('123'); 
}; 


describe('my fn', function() { 
    it('gets user name and ID', function() { 
    spyOn(externalApi, 'get').andCallFake(function(myParam) { 
     if (myParam == 'abc') { 
     return 'Jane'; 
     } else if (myParam == '123') { 
     return 98765; 
     } 
    }); 
    }); 
}); 

Odpowiedz

112

callFake jest właściwa droga, ale można uprościć stosując obiekt do przechowywania wartości powrót

describe('my fn', function() { 
    var params = { 
    'abc': 'Jane', 
    '123': 98765 
    } 

    it('gets user name and ID', function() { 
    spyOn(externalApi, 'get').and.callFake(function(myParam) { 
    return params[myParam] 
    }); 
    }); 
}); 

zależności od wersja jaśmin, składnia jest nieco inna:

  • 1.3.1: .andCallFake(fn)
  • 2.0: .and.callFake(fn)

Zasoby:

+9

To jest teraz 'and.callFake' - http://jasmine.github.io/2.2/introduction.html#section-Spies:_ and.callFake

+0

musiałem wrócić różne obietnice, więc powrót wyglądał nieco inaczej: return q.when (params [myParam]) ;. W przeciwnym razie było to miejsce na rozwiązanie mojego problemu. Moim marzeniem rozwiązaniem byłaby zmiana połączeń „and.returnValue”. –

+5

czuje się jak jaśmin powinien mieć lepszy sposób zadeklarowania tego. Jak 'spyOn (fałszywy, 'metoda'). WithArgs ('abc'). And.returnValue ('Jane')' i 'spyOn (fake, 'metoda'). WithArgs ('123'). And.returnValue (98765) '. – jrharshath

3

Można także użyć $provide stworzyć szpiegiem. I pozoruj, używając and.returnValues zamiast and.returnValue, aby przekazać sparametryzowane dane.

Zgodnie docs Jasmine: Przez łańcuchowym szpiega z and.returnValues, wszystkie wywołania funkcji powróci konkretnych wartości w porządku, dopóki nie dojdzie do końca listy wartości zwracanych, w którym momencie nastąpi powrót niezdefiniowana dla wszystkie kolejne połączenia.

describe('my fn',() => { 
    beforeEach(module($provide => { 
     $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get'])); 
    })); 

     it('get userName and Id', inject((externalApi) => { 
      // Given 
      externalApi.get.and.returnValues('abc','123'); 

      // When 
      //insert your condition 

      // Then 
      // insert the expectation     
     })); 
}); 
+0

to jest poprawna odpowiedź, ponieważ test powinien zawsze dokładnie wiedzieć, jak szpieg zostanie wywołana, a więc należy po prostu użyć 'returnValues' obsługiwać wiele połączeń – Schmuli

Powiązane problemy