我有以下函式可以多次呼叫 AWS IAM。我能夠在單個呼叫上運行單元測驗。但是,當我對下面的測驗進行測驗時,我感到恐慌:“運行時錯誤、無效記憶體或空指標取消參考”
func (iamDependency *iamService) CreateMyUser(userName string) (string, error){
//first IAM call
err:=iamDependency.GetUser(&iam.GetUserInput{UserName: userName})
if err != nil {
fmt.Println("Failed to get user, attempting to create")
//second IAM call
err:=iamDependency.CreateUser(&iam.CreateUserInput{UserName: userName})
if err != nil {
log.Fatalf("Failed to create user\n", err )
}
}
}
這是我的模擬和測驗:
type mockSomeOutput{}
type mockedIamCall{
iamiface.IAMAPI
Response mockSomeOutput
}
func TestCreateMyUser(t *testing.T){
t.Run("Successful user create", fun(t *testing.T){
mo:= mockOutput{}
m:= mockedIamCall{Response: mo}
d:= iamService{
iamInstance: m,
}
mockedUser:="TestUser"
_, err:= d.ResetCredentials(&mockedUser)
if err != nil {
t.Fatal("Everything should be ok")
}
})
}
我想知道在 Golang 中對這種函式進行單元測驗是否有任何技巧或指南。
感謝任何幫助。
uj5u.com熱心網友回復:
您可能想嘗試使用:https : //github.com/golang/mock
您可以為 iamiface.IAMAPI(從實際介面)創建模擬實作,然后期待函式呼叫并模擬回應。
使用mockgen.
mockgen -source={path to IAM API interface}
然后你可以期待在測驗用例中使用類似這樣的函式呼叫:
function TestExample(t *testing.T) {
ctrl := gomock.NewController(t)
mockIAMAPI := mock_package.NewMockIAMAPI(ctrl)
mockIAMAPI.EXPECT().GetUser(expectedInput).Return(mockResponse).Times(1)
}
uj5u.com熱心網友回復:
@Raymond 感謝您的回復,很有見地。但是,我似乎找到了一個更簡單的答案來解決我自己的問題。我創建了自己的界面
type UserCreator interface{
GetUser(*iam.GetUserInput) (*iam.GetUserOutput, error)
CreateUser(*iam.CreateUserInput) (*iam.CreateUserInput, error)
}
func CreateMyUser(iamSvc UserCreator, userName string) (string, error){
//first IAM call
_, err:=iamSvc.GetUser(&iam.GetUserInput{UserName: userName})
if err != nil {
fmt.Println("Failed to get user, attempting to create")
//second IAM call
_, err:=iamSvc.CreateUser(&iam.CreateUserInput{UserName: userName})
if err != nil {
log.Fatalf("Failed to create user\n", err )
}
}
}
然后對于我的測驗,我只是實作了介面,覆寫了這些方法,并傳遞了一個模擬:
type mockUserCreator{
Response string
}
func (m * mockUserCreator) GetUser(input *iam.GetUserInput)(*iam.GetUserOutput, error){
return &iam.GetUserOutput{}, nil
}
func (m * mockUserCreator) CreateUser(input *iam.CreateUserInput)(*iam.CreateUserOutput, error){
return &iam.CreateUserOutput{}, nil
}
func TestCreateMyUser(t *testing.T){
testcases:=[]struct{
TestName string
}{
{
TestName:"Some test"
}
}
for _, tt := range testcases{
t.Run(tt.TestName, func(t *testing.T){
m := mockUserCreator{}
mockUser := "TestUser"
_, err:= CreateMyUser(&m, mockUser)
if err != nil {
t.Error("TestCreateMyUser returned and error: %s", err)
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/362243.html
標籤:亚马逊网络服务 单元测试 走 aws-sdk-go
上一篇:使用結構陣列發出封送YAML
下一篇:在GitHub存盤庫中匯入特定包
