在 Go 函數測試中,Mocks 和 Stubs 允許隔離和驗證外部相依性。 Mocks 模擬依賴項的行為,而 Stubs 提供固定值。使用 Mocks,需要使用 mockgen 產生 mock 文件,在測試中引入 mock,並設定 mock 期望值。使用 Stubs,需要引入 stub 套件,建立 stub,並斷言 stub 是否被呼叫。透過使用 Mocks 和 Stubs,我們可以提高函數測試的穩健性和可信度。
如何在Go 函數測試中使用Mocks 和Stubs
在Go 中進行函數測試時,Mock 和Stub 是隔離和驗證外部相依性的有效技術。以下我們將探討如何在測試中使用這些技巧。
什麼是 Mocks 和 Stubs?
Mock 是一個模擬外部依賴項的替代品,可讓您在測試中指定其行為和特性。相反,Stub 是一種提供固定值的替代品,而不會模擬依賴項的行為。
使用Mocks:
##使用mockgen 產生
mock 檔案:
go get github.com/golang/mock/mockgen mockgen -package=api -destination=mocks/customer_mock.go github.com/your-org/your-repo/api CustomerService
import mocks "github.com/your-org/your-repo/api/mocks" func TestFunctionWithCustomerService(t *testing.T) { mockCustomerService := &mocks.CustomerService{} }
// 设置客户创建方法的预期行为 mockCustomerService.On("CreateCustomer", mock.Anything).Return(nil, nil)
#使用Stubs:
引入Stub 套件:import "github.com/stretchr/testify/stub"
// 创建一个提供固定数字值的 `Stub`,作为 avg 升序的占位符 stubAvg := stub.On(ioutil, "ReadFile").Return([]byte("80"), nil)
實戰案例:
假設我們有一個函數GetCustomerAge,它從依賴項
CustomerService獲取客戶數據。
func GetCustomerAge(customerID int64) (int, error) { customer, err := service.GetCustomer(customerID) if err != nil { return 0, err } return customer.Age, nil }
使用Mock 測試:
func TestGetCustomerAgeWithMock(t *testing.T) { mockCustomerService := &mocks.CustomerService{} // 设置 Mock 期望值 mockCustomerService.On("GetCustomer", mock.Anything).Return(&models.Customer{Age: 25}, nil) age, err := GetCustomerAge(1) assert.NoError(t, err) assert.Equal(t, 25, age) }
#使用Stub 測試:
func TestGetCustomerAgeWithStub(t *testing.T) { stubCustomerService := stub.On(service, "GetCustomer").Return(&models.Customer{Age: 25}, nil) age, err := GetCustomerAge(1) assert.NoError(t, err) assert.Equal(t, 25, age) // 断言 Stub 是否被调用 assert.True(t, stubCustomerService.Called()) }
以上是Golang 函式測試中的 mocks 和 stubs的詳細內容。更多資訊請關注PHP中文網其他相關文章!