Mocking Dependencies
Bog'liqliklarni soxtalashtirish (mocking)
Funksiya haqiqiy email yuborish yoki bazaga yozish kabi "tashqi" ishni bajarsa, uni testda haqiqatan bajarish istalmaydi (sekin, ishonchsiz, yon ta'sirlari bor). Buning o'rniga — interfeys orqali "soxta" (fake/mock) versiyasini beramiz.
package main
import "testing"
type Notifier interface {
Notify(to, message string) error
}
type fakeNotifier struct {
messages []string
}
func (f *fakeNotifier) Notify(to, message string) error {
f.messages = append(f.messages, to+": "+message)
return nil
}
func WelcomeUser(n Notifier, username string) error {
return n.Notify(username, "Xush kelibsiz!")
}
func TestWelcomeUser(t *testing.T) {
fake := &fakeNotifier{}
if err := WelcomeUser(fake, "aziz"); err != nil {
t.Fatalf("kutilmagan xato: %v", err)
}
want := "aziz: Xush kelibsiz!"
if len(fake.messages) != 1 || fake.messages[0] != want {
t.Errorf("messages = %v, kutilgan [%s]", fake.messages, want)
}
}WelcomeUser haqiqiy email yubormaydi — u faqat Notifier interfeysi bilan ishlaydi ("Interfaces & Polymorphism" kursida o'rgangan tamoyil). Testda esa haqiqiy email yuboradigan turni emas, hech qanday tashqi ta'sir qilmaydigan fakeNotifierni beramiz — u faqat yuborilgan xabarlarni ro'yxatga yig'ib boradi, shu orqali "WelcomeUser to'g'ri xabar yubordimi?" ni tekshiramiz. t.Fatalf — t.Errorfdan farqli, xato bo'lsa testni darhol to'xtatadi (davom etish ma'nosiz bo'lganda ishlatiladi).
>_ Exercise
Saqlash bog'liqligini soxtalashtirib, funksiyani sinang.
- •fakeStore: Save(key, value string) error metodini amalga oshiruvchi soxta tur yozing, saved map'ida saqlasin
- •SaveSetting(store, key, value) funksiyasini fake bilan chaqirib, saved[key] == value ekanini tekshiring
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Interfeys orqali kod yozish — testda haqiqiy (sekin, tashqi) bog'liqlik o'rniga soxta (fake/mock) versiyasini berish imkonini beradi.
NEXT UP
Benchmarking Basics
$ go run main.go
Kodingizni ishga tushiring