首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指证嘲弄一种方法

指证嘲弄一种方法
EN

Stack Overflow用户
提问于 2019-01-18 19:15:51
回答 1查看 5.9K关注 0票数 5

我是新来的。我试图使用struct来模拟单一的testify方法,但我不知道如何做到。

下面是代码:

代码语言:javascript
复制
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"
}

下面是一个测试:

代码语言:javascript
复制
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参数所允许的内容。

更新testify导入的包如下:

代码语言:javascript
复制
    "github.com/stretchr/testify/mock"
    "github.com/stretchr/testify/suite"
EN

回答 1

Stack Overflow用户

发布于 2019-01-23 02:05:34

也许这个能帮到你。

代码语言:javascript
复制
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.

祝好运。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54260189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档