我有一个要测试的课程:
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 。
答案 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{}}
}