💬Что из себя представляет стабы (stubs) и моки (mock) в контексте тестирования в Go?
📌Стабы (stubs) и моки (mocks) являются техниками, используемыми для изоляции тестируемого кода от внешних зависимостей во время тестирования в Go.
🔸Стабы (stubs) — это фейковые объекты, которые предоставляют предопределенные ответы на вызовы методов во время тестирования.
🔸Моки (mocks) — это более продвинутые фейковые объекты, которые, кроме предоставления предопределенных ответов, также проверяют, как и когда методы были вызваны в тестах, что помогает в проверке взаимодействия между объектами.
📌В первом примере создается стаб
📌Стабы (stubs) и моки (mocks) являются техниками, используемыми для изоляции тестируемого кода от внешних зависимостей во время тестирования в Go.
🔸Стабы (stubs) — это фейковые объекты, которые предоставляют предопределенные ответы на вызовы методов во время тестирования.
package main
import "fmt"
type DatabaseStub struct{}
func (db *DatabaseStub) GetUserName(id int) string {
return "Alice"
}
type Database interface {
GetUserName(id int) string
}
func PrintUserName(db Database, id int) {
name := db.GetUserName(id)
fmt.Println(name)
}
func main() {
dbStub := &DatabaseStub{}
PrintUserName(dbStub, 1)
}
🔸Моки (mocks) — это более продвинутые фейковые объекты, которые, кроме предоставления предопределенных ответов, также проверяют, как и когда методы были вызваны в тестах, что помогает в проверке взаимодействия между объектами.
package main
import (
"github.com/stretchr/testify/mock"
"testing"
)
type DatabaseMock struct {
mock.Mock
}
func (db *DatabaseMock) GetUserName(id int) string {
args := db.Called(id)
return args.String(0)
}
func TestPrintUserName(t *testing.T) {
dbMock := new(DatabaseMock)
dbMock.On("GetUserName", 1).Return("Alice")
name := dbMock.GetUserName(1)
dbMock.AssertExpectations(t)
}
📌В первом примере создается стаб
DatabaseStub
, который имеет метод GetUserName
. Во втором примере создается мок DatabaseMock
с использованием библиотеки testify
, который проверяет, был ли метод GetUserName
вызван с правильным аргументом.