GoDasturchi
Mocking Dependencies

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.

example.go
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.Fatalft.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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.Fatalft.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.

Hints (0/3)

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