Свидетельствуйте, издеваясь над одним методом - PullRequest
0 голосов
/ 18 января 2019

Я довольно новичок. Я пытаюсь смоделировать один метод struct, используя 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"
}

и вот тест:

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())
}

Идея состоит в том, чтобы использовать только метод GetName, чтобы он печатал Hello World from foo bar!. Это возможно?

Для тех, кто знаком с Python, то, что я пытаюсь достичь, похоже на то, что класс unittest.Mock разрешает через аргумент wraps.

UPDATE Из testify импортированы следующие пакеты:

    "github.com/stretchr/testify/mock"
    "github.com/stretchr/testify/suite"

1 Ответ

0 голосов
/ 23 января 2019

Может быть, это вам поможет.

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.

Удачи.

...