我是刚接触Go语言的,而且我是从OOP语言学来的。现在,在Go语言中,接口和类的概念似乎完全不同。
我想知道在测试的情况下mocking是如何工作的。我的困惑是是否可以使用struct
作为一个类,如果下面的方法是你应该怎么做?假设DefaultArticlesRepository
是真实的数据,MockArticlesRepository
是模拟它。
type ArticlesRepository interface {
GetArticleSections() []ArticleSectionResponse
}
type DefaultArticlesRepository struct{}
type MockArticlesRepository struct{}
func (repository DefaultArticlesRepository) GetArticleSections() []ArticleSectionResponse {
return []ArticleSectionResponse{
{
Title: "Default response",
Tag: "Default Tag",
},
}
}
func (repository MockArticlesRepository) GetArticleSections() []ArticleSectionResponse {
return []ArticleSectionResponse{
{
Title: "Mock response",
Tag: "Mock Tag",
},
}
}
func ArticleSectionsProvider(v ArticlesRepository) ArticlesRepository {
return v
}
func TestFoo(t *testing.T) {
realProvider := ArticleSectionsProvider(DefaultArticlesRepository{})
mockProvider := ArticleSectionsProvider(MockArticlesRepository{})
assert.Equal(t, realProvider.GetArticleSections(), []ArticleSectionResponse{
{
Title: "Default response",
Tag: "Default Tag",
},
})
assert.Equal(t, mockProvider.GetArticleSections(), []ArticleSectionResponse{
{
Title: "Mock response",
Tag: "Mock Tag",
},
})
}
2条答案
按热度按时间9nvpjoqh1#
首先,我建议你使用https://github.com/vektra/mockery来自动生成基于接口的mock结构体。实现一个像你这样的mock结构体是可以的,但我认为如果你真的不需要一个非常特殊的行为,那只会浪费你的时间和精力。
其次,我们不需要像在代码中那样测试模拟结构体。
因此,当我们使用mock结构体时,假设struct***a***是struct***B***的依赖项。例如:
而你想测试struct***B***的函数DoSomething,当然你并不关心,也不想在这种情况下测试struct***a***的函数DoTask,那么你只需要在测试中提供一个struct***a***的mock给struct***b***即可,这个mock也可以帮助你在测试struct***b * 时避免处理任何与struct***a*相关的挣扎。.现在你的测试应该是这样的:
最后,这只是一件小事,但看不到您的 * ArticleSectionsProvider * 的明确责任。
ymdaylpp2#
首先,不需要使用任何外部mocking库,例如:
您真正需要的只是一个接口和一些使用标准库并行运行所有测试的代码。
检查下面的真实的世界示例,而不是下一个“计算器测试示例”:
api/storage.go
api/server.go
api/server_test.go
运行测试