gpt4 book ai didi

unit-testing - 如何为单元测试模拟标准包函数

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:15 26 4
gpt4 key购买 nike

我有三个功能:

func IsSymlinks(path string) {
...
...
}

func (c *MyClass) myFunc1(path string) {
...more code
...more code
if IsSymlinks(path) {
realPath := filepath.EvalSymlinks(path)
}
...more code
...more code
}

func myFunc2(path string) {
...more code
...more code
if IsSymlinks(path) {
realPath := filepath.EvalSymlinks(path)
}
...more code
...more code
}

如何通过模拟 filepath.EvalSymlinks 和 IsSymlinks 来测试 myFunc1 和 myFunc2?我搜索了一些帖子,看到了几个解决方案。

  1. 创建一个函数类型的EvalSymlinks变量,用filepath.EvalSymlinks初始化,然后在测试包中,改成我的实现。但是,我不想使用这种方法。

  2. 将 filepath.EvalSymlinks 和 IsSymlinks 作为参数传入 myFunc。我也不想使用这种方式。

  3. 很多人都在谈论模拟使用界面。能否请你帮忙?或者可以测试 myFunc 的另一种方法?谢谢!

  4. 我正在考虑的另一个选择是,在我进行功能测试之前在操作系统中创建一个指向路径的符号链接(symbolic link),然后在测试后立即删除该符号链接(symbolic link)是否是一个好习惯?

最佳答案

您可以使用界面来完成。例如,假设您有一个名为 Linker 的接口(interface):

type Linker interface {
IsSymlinks(path String)
}

现在您可以将链接器对象嵌入到调用 IsSymlinks 方法的函数中。

type MyClass struct {
Linker
}

func (p *MyClass) myFunc(path String) {
_ = p.Linker.IsSymlinks(path)
}

现在在您的测试中,您可以创建一个模拟链接器。

type mockLinker struct{}
//implement the IsSymlinks on the mockLinker as you wish

p := &MyClass{
Linker: mockLinker,
}

p.myFunc(path)

p.myFunc 到达 IsSymlinks 方法时,它会调用您模拟的 IsSymlinks 方法。

对于 filepath.EvalSymlinks(path),您可以将该方法包装在您的另一个方法中,并将新方法添加到同一接口(interface)并模拟该方法,而不是模拟 EvalSymlinks.

仅仅为了测试目的而创建接口(interface)可能并不总是最好的主意,因为在某些情况下可能会导致拥有大型接口(interface),这在 Go 中不是惯用的,因为它会降低代码的可读性。

关于unit-testing - 如何为单元测试模拟标准包函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51228459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com