证明模拟单个方法

se7*_*7en 6 testing mocking go

我还是个新手。我正在尝试模拟structusing的单一方法testify,但我不知道该怎么做。

这是代码:

type HelloWorlder interface {
    SayHello() string
    GetName() string
}

type HelloWorld struct{}

func (hw *HelloWorld) SayHello() string {
    return fmt.Sprintf("Hello World from %s!", hw.GetName())
}

func (hw *HelloWorld) GetName() string {
    return "se7entyse7en"
}
Run Code Online (Sandbox Code Playgroud)

这是测试:

type MockHelloWorld struct {
    mock.Mock
    HelloWorld
}

func (m *MockHelloWorld) GetName() string {
    args := m.Called()
    return args.String(0)
}

type SomeTestSuite struct {
    suite.Suite
}

func (s *SomeTestSuite) TestMocking() {
    mhw := new(MockHelloWorld)
    mhw.On("GetName").Return("foo bar")

    fmt.Println(mhw.SayHello())
}
Run Code Online (Sandbox Code Playgroud)

这个想法是仅模拟该GetName方法,以便它打印Hello World from foo bar!. 那可能吗?

unittest.Mock对于熟悉 Python 的人来说,我想要实现的目标与类通过参数允许的目标类似wraps

更新 导入的包testify如下:

    "github.com/stretchr/testify/mock"
    "github.com/stretchr/testify/suite"
Run Code Online (Sandbox Code Playgroud)

Bil*_*uan 3

也许这会对你有所帮助。

package main

import (
    "fmt"
    "github.com/stretchr/testify/mock"
)

type userReader interface {
    ReadUserInfo(int) int
}

type userWriter interface {
    WriteUserInfo(int)
}

type UserRepository struct {
    userReader
    userWriter
}

type realRW struct{}

func (db *realRW) ReadUserInfo(i int) int {
    return i
}

func (db *realRW) WriteUserInfo(i int) {
    fmt.Printf("put %d to db.\n", i)
}

// this is mocked struct for test writer.
type MyMockedWriter struct {
    mock.Mock
}

func (m *MyMockedWriter) ReadUserInfo(i int) int {

    args := m.Called(i)
    return args.Int(0)

}

func main() {
    rw := &realRW{}
    repo := UserRepository{
        userReader: rw,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", repo.ReadUserInfo(100))
    repo.WriteUserInfo(100)

    // when you want to write test.
    fmt.Println("Begin test....................")
    testObj := new(MyMockedWriter)
    testObj.On("ReadUserInfo", 123).Return(250)

    testRepo := UserRepository{
        userReader: testObj,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", testRepo.ReadUserInfo(123))
    testRepo.WriteUserInfo(100)
}

// Output:
// Userinfo is: 100
// put 100 to db.
// Begin test....................
// Userinfo is: 250
// put 100 to db.

Run Code Online (Sandbox Code Playgroud)

祝你好运。