Mocki i szpiegi
Odizoluje Pan/Pani testowany kod.
Mocki i szpiegi to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Duble testowe
Czasami funkcja zależy od czegoś powolnego lub zewnętrznego, na przykład od wywołania sieciowego albo loggera. Duble testowe zastępują takie zależności elementami, nad którymi można sprawować kontrolę.
busted udostępnia trzy rodzaje: spies, stubs i mocks. Każdy z nich służy do innego celu.
Działanie spy
Spy opakowuje funkcję i rejestruje sposób jej wywoływania, jednocześnie nadal uruchamiając oryginalną funkcję. Pozwala sprawdzić, czy coś zostało wywołane.
Można utworzyć go za pomocą spy.new, opakowując funkcję, albo obserwować pole tabeli.
local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()Obserwowanie metody za pomocą spy
Elementu spy.on należy użyć do obserwowania metody istniejącej tabeli. Oryginalna metoda nadal jest wykonywana, ale busted śledzi każde wywołanie.
Jest to idealne rozwiązanie do potwierdzania efektu ubocznego, na przykład wywołania loggera.
spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()Sprawdzanie liczby wywołań
Spy rejestruje, ile razy został wywołany. Do sprawdzenia dokładnej liczby wywołań należy użyć was.called(n).
Pozwala to wykryć błędy, w których funkcja jest wywoływana zbyt często albo nie jest wywoływana wcale.
assert.spy(s).was.called(2)
assert.spy(s).was_not.called()Sprawdzanie argumentów wywołania
Można sprawdzić, jakie argumenty otrzymał spy, używając was.called_with. busted porównuje zarejestrowane argumenty z oczekiwanymi.
Potwierdza to nie tylko, że funkcja została uruchomiona, ale także że uruchomiono ją prawidłowo.
local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)Działanie stub
Stub całkowicie zastępuje funkcję, więc oryginalna funkcja nigdy nie jest uruchamiana. Należy go używać do pomijania powolnych lub niepożądanych operacji, takich jak rzeczywisty dostęp do sieci lub dysku.
Można utworzyć go za pomocą stub na polu tabeli. Domyślnie stub nic nie robi i zwraca nil.
stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()Wartości zwracane przez stub
Za pomocą returns można sprawić, aby stub zwracał stałą wartość. Dostarcza to kontrolowanych danych do testowanego kodu.
Test nie zależy wtedy w ogóle od rzeczywistej zależności.
stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)Działanie mock
Mock przyjmuje istniejącą tabelę i jednocześnie zamienia wszystkie jej funkcje w spy lub stub. Jest to wygodny sposób śledzenia całego obiektu.
Należy wywołać mock(obj), aby go opakować, a następnie wykonywać asercje dotyczące poszczególnych metod.
local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()Mock z metodami zastąpionymi przez stub
Przekazanie wartości true jako drugiego argumentu do mock powoduje zastąpienie każdej metody przez stub, dzięki czemu żadna z oryginalnych metod nie zostanie uruchomiona. Pozwala to całkowicie odizolować obiekt.
Należy użyć tego rozwiązania, gdy rzeczywiste metody mają efekty uboczne, których trzeba uniknąć.
local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())Przywracanie dubli testowych
Spy, stub i mock modyfikują współdzielone tabele, dlatego należy je przywrócić, w przeciwnym razie kolejne testy zobaczą dubel. Należy wywołać :revert() lub mock.revert.
Przywracanie należy umieścić w after_each, aby zagwarantować czysty stan między testami.
after_each(function()
mock.revert(m)
end)Wybór właściwego dubla
Spy służy do obserwowania rzeczywistej funkcji, stub do zastępowania jej kontrolowanym działaniem, a mock do jednoczesnego opakowania całego obiektu.
Należy wybierać najprostszy dubel, który spełnia zadanie. Nadmierne używanie mocków może sprawić, że testy będą kruche i ukrywać rzeczywiste błędy.
describe("mailer", function()
it("sends once", function()
local s = spy.on(smtp, "send")
mailer.notify("a@b.com")
assert.spy(s).was.called(1)
end)
end)Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat dubli testowych w busted.
Podsumowanie
Duble testowe izolują kod od powolnych lub zewnętrznych zależności. Spy rejestruje wywołania, uruchamiając oryginalną funkcję, stub zastępuje funkcję kontrolowanym działaniem, a mock opakowuje cały obiekt.
Asercje należy wykonywać za pomocą was.called i was.called_with, a duble zawsze przywracać za pomocą revert w after_each, aby zachować izolację testów.
Często zadawane pytania
Czy lekcja „Mocki i szpiegi” jest bezpłatna?
Tak — pełny tekst „Mocki i szpiegi” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Mocki i szpiegi”?
Odizoluje Pan/Pani testowany kod. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Mocki i szpiegi”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego testować
- Bloki describe i it
- Asercje
- Mocki i szpiegi