2017-09-20 24 views
1

main.goをテストするための単体テストとそれが呼び出す関数の内部に関数(DeviceRepo.Get())を2回出してから、別の戻り値を返すGet関数をモックしたいと思います2回目にGet関数をどうやって模倣するのか分かりません。Golang mocking関数が2回呼び出されました

main.go:

type DeviceInterface interface {} 
type DeviceStruct struct{} 

var DeviceRepo repositories.DeviceRepoInterface = &repositories.DeviceRepoStruct{} 

func (d *DeviceStruct) CheckDevice(familyname string, name string, firmwareversion string) string { 
deviceList, deviceListErr := DeviceRepo.Get(familyname, name, firmwareversion) 

if deviceListErr != "" { 
    return "some error" 
} 

if len(deviceList) == 0 { 
    deviceList, _ := DeviceRepo.Get(familyname, name, "") 

    if len(deviceList) > 0 { 
     return "Invalid firmware version." 
    } else { 
     return "Unknown device." 
    } 
} 

return "Success" 
} 

main_test.go:

type MockGetDeviceList struct { 
    returnResult []resources.DeviceListDataReturn 
    returnError string 
    } 

    func (m *MockGetDeviceList) Get(familyName string, name string, firmwareVersion string) ([]resources.DeviceListDataReturn, string) { 
    return m.returnResult, m.returnError 
    } 

    func Test_CheckDevice_WrongFirmwareVersion(t *testing.T) { 
    Convey("Test_CheckDevice_WrongFirmwareVersion", t, func() { 
    familyNameMock := "A" 
    nameMock := "A" 
    firmwareVersionMock := "3" 

    mockReturnData := []resources.DeviceListDataReturn{} 

    mockReturnDataSecond := []resources.DeviceListDataReturn{ 
     { 
      FamilyName:  "f", 
      Name:   "n", 
      FirmwareVersion: "1.0", 
     }, 
    } 

    deviceModel := DeviceStruct{} 

    getDeviceList := DeviceRepo 
    defer func() { DeviceRepo = getDeviceList }() 
    DeviceRepo = &MockGetDeviceList{returnResult: mockReturnData} 

    getDeviceList = DeviceRepo 
    defer func() { DeviceRepo = getDeviceList }() 
    DeviceRepo = &MockGetDeviceList{returnResult: mockReturnDataSecond} 

    expectReturn := "Invalid firmware version." 

    actualResponse := deviceModel.CheckDevice(familyNameMock, nameMock, firmwareVersionMock) 

    Convey("Checking check-device wrong firmware version", func() { 
     So(actualResponse, ShouldEqual, expectReturn) 
    }) 
}) 
} 

Iが初めてで取得関数戻り[] resources.DeviceListDataReturn {}を模擬した後、戻りたいです[] resources.DeviceListDataReturn { {FamilyNameで: "F"、 名称: "1.0"、 }、 : "n" は、 FirmwareVersion}第TIで私。

答えて

0

呼び出し番号に基づいて異なる機能または方法を使用するには、この情報を呼び出し可能にする必要があります。

最も簡単に追加して、各コールのカウンタをインクリメントし、関数の内部カウンタの現在の値を調べ、その値に応じて、異なる動作をすることです:

type MockGetDeviceList struct { 
    returnResult []resources.DeviceListDataReturn 
    returnError string 
    getCount  int 
} 

func (m *MockGetDeviceList) Get(familyName string, name string, 
    firmwareVersion string) ([]resources.DeviceListDataReturn, string) { 

    m.getCount++ 
    if m.getCount == 1 { 
     // First call: 
     return nil, m.returnError 
    } 
    // Sencond and subsequent calls: 
    return m.returnResult, "" 
} 

別の解決策は、モックオブジェクトを置き換えることであろう/関数が最初の呼び出しの後に機能しますが、この解決策は理解しにくく、脆弱でメンテナンスが難しいです。

+0

ありがとうございました@icza、私はそれを持っています。 – Disuan

関連する問題