测试中的模拟方法

时间:2018-10-08 07:22:28

标签: go testing mocking

我有一个要测试的课程:

type ApiGateway struct {
    username  string
    password  string
    scsClient *scsClient.APIDocumentation
    auth      Auth
}

type Auth struct {
    token   string
    validTo int32
}

func New(host string, scheme string, username string, password string) *ApiGateway {
    var config = scsClient.TransportConfig{host, "/", []string{scheme}}
    var client = scsClient.NewHTTPClientWithConfig(strfmt.Default, &config)

    return &ApiGateway{username, password, client, Auth{}}
}

func (s *ApiGateway) isTokenValid() bool { ... }

此isTokenValid方法从类内的所有其他方法中调用,以验证和/或更新API令牌。在测试中,我想模拟此方法,例如,它总是返回true。

我如何归档?


编辑: 我的代码:

apiGateway.go

type StubAdapter struct {
    ApeGatewayAdapter
}

type ApeGatewayAdapter interface {
    isTokenValid() bool
}

type ApiGateway struct {
    username  string
    password  string
    scsClient *scsClient.APIDocumentation
    auth      Auth
    adapter ApeGatewayAdapter
}

type Auth struct {
    token   string
    validTo int32
}

func New(host string, scheme string, username string, password string, a ApeGatewayAdapter) *ApiGateway {
    var config = scsClient.TransportConfig{host, "/", []string{scheme}}
    var client = scsClient.NewHTTPClientWithConfig(strfmt.Default, &config)

    return &ApiGateway{username, password, client, Auth{}, a}
}

apiGateway_test.go

type MockAdapter struct {
    ApeGatewayAdapter
}

func (m MockAdapter) isTokenValid() bool {
    return true
}

func TestApiGateway_GetDevice(t *testing.T) {
    var scsGateway = New("foo.com", "http", "testuser", "testpwd", MockAdapter{})

    fmt.Println(scsGateway.isTokenValid())
}

我希望测试调用我的模拟方法并返回它没有的 true

1 个答案:

答案 0 :(得分:0)

问题是您在isTokenValid()中定义了MockAdapter,而不是ApeGatewayAdapter。因此,当您尝试进行测试时,它表示

  

scsGateway.isTokenValid未定义(类型* ApiGateway没有字段或   方法isTokenValid)

您需要更改结构中的体系结构,因为您已经为适配器创建了方法New()(没关系),但是这里的重要事情(几乎总是在Go中)是返回接口!

isTokenValid()是为外部类型定义的(在您的MockAdapter测试用例中),因此除非更改类型的定义或从{更改方法的实现,否则您无法调用它{1}}至MockAdapter

我认为最好的解决方案应该是删除ApeGatewayAdapter并直接与StubAdapter一起使用,并为此类型定义方法ApiGateway。然后,您的测试应该可以删除内部isTokenValid()并仅使用ApeGatewayAdapter模拟apigateway及其方法。

您的代码应如下所示:

gateway.go

MockAdapter

gateway_test

package gateway

type ApeGatewayAdapter interface {
    isTokenValid() bool
}

type ApiGateway struct {
    username string
    password string
    auth     Auth
}

type Auth struct {
    token   string
    validTo int32
}

func (a ApiGateway) isTokenValid() bool {
    // TODO add your validations
    return true
}

func New(host string, scheme string, username string, password string) ApeGatewayAdapter {

    return ApiGateway{username, password, Auth{}}
}