W lutym 2017 roku połączyli PR dodając tę funkcję, wydali w kwietniu 2017.
więc aby szpiegować getters / setters, których używasz:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
gdzie myObj jest twoją instancją, 'myGetterName' to nazwa tego zdefiniowanego w twojej klasie as, get myGetterName() {}
a trzeci parametr to typ get
lub set
.
Możesz użyć tych samych twierdzeń, których już używasz w przypadku szpiegów utworzonych w programie spyOn
.
Możesz więc na przykład:
const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.
Oto wiersz w kodzie źródłowym github, w którym ta metoda jest dostępna, jeśli jesteś zainteresowany.
https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199
Odpowiadając na pierwotne pytanie, z jaśminem 2.6.1:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
valueA
jestObservable
lubSubject
? DostajęProperty valueA does not have access type get
Jest jakiś powód, dla którego nie możesz po prostu zmienić tego bezpośrednio na obiekcie? To nie jest tak, że javascript wymusza widoczność właściwości na obiekcie.
źródło
spyOn
jawnie wskazuje, że chcę coś mockować, podczas gdy ja bezpośrednio ustawiam właściwość niejawnie wskazuje, że chcę coś mock, i nie jestem pewien, czy ktoś inny zrozumie, że kpię z czegoś, gdy czyta kod. Innym przypadkiem jest to, że nie chcę zmieniać wewnętrznego zachowania obiektu, na przykład jeśli zmienię właściwość length dla tablicy, tablica jest przycinana, więc makieta będzie lepszaspyOn
.spyOn
nie zdaje testu, jeśli nieruchomość nie istnieje.TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Jasmine nie ma takiej funkcji, ale możesz zhakować coś razem za pomocą
Object.defineProperty
.Możesz refaktoryzować swój kod, aby użyć funkcji getter, a następnie szpiegować getter.
źródło
and.returnValue(1)
Najlepszym sposobem jest użycie
spyOnProperty
. Oczekuje 3 parametrów i musisz przekazaćget
lubset
jako trzeci parametr.Przykład
Ja tu ustawienie
get
odclientWidth
oddiv.nativeElement
obiektu.źródło
Jeśli używasz ES6 (Babel) lub TypeScript, możesz usunąć właściwość za pomocą metod dostępu get i set
Następnie w swoim teście możesz sprawdzić, czy właściwość jest ustawiona za pomocą:
źródło
Właściwym sposobem na to jest szpiegowanie właściwości, co pozwoli na zasymulowanie właściwości obiektu o określonej wartości.
źródło
Załóżmy, że istnieje metoda podobna do tej, która wymaga przetestowania.
src
Właściwość małego obrazu wymaga sprawdzeniaPoniższa funkcja spyOn () powoduje podanie "nowego obrazu" fałszywego kodu z testu kod spyOn zwraca obiekt, który ma tylko właściwość src
Ponieważ zmienna "hook" jest widoczna w fałszywym kodzie w SpyOn, a także później po wywołaniu "reportABCEvent"
To jest dla jaśminu 1.3, ale może działać na 2.0, jeśli "andCallFake" zostanie zmieniona na nazwę 2.0
źródło
Używam siatki kendo i dlatego nie mogę zmienić implementacji na metodę pobierającą, ale chcę testować wokół tego (mockowanie siatki), a nie testować samej siatki. Używałem obiektu szpiegowskiego, ale to nie obsługuje mockowania właściwości, więc robię to:
Jest trochę rozwlekły, ale działa świetnie
źródło
Jestem trochę spóźniony na imprezę, którą znam, ale
Możesz uzyskać bezpośredni dostęp do obiektu wywołań, który może dostarczyć zmienne dla każdego wywołania
źródło
Nie możesz mockować zmiennej, ale możesz utworzyć dla niej funkcję pobierającą i mockować tę metodę w swoim pliku specyfikacji.
źródło