微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加测试用例并运行go test之后,是什么原因导致“没有这样的文件或目录”?

如何解决添加测试用例并运行go test之后,是什么原因导致“没有这样的文件或目录”?

问题

在向运行go test -v ./...的现有测试文件添加一个测试功能后,由于在添加一个测试用例后出现多个no such file or directory构建错误而失败。错误消息似乎与更改无关。

添加的测试用例可以在底部的相关代码部分中找到。

错误消息是:

open /tmp/go-build842273301/b118/vet.cfg: no such file or directory
open /tmp/go-build842273301/b155/vet.cfg: no such file or directory
# tornadowarnung.xyz/riotwatch/riot/static
vet: in tornadowarnung.xyz/riotwatch/riot/static,can't import facts for package "encoding/json": open $WORK/b036/vet.out: no such file or directory
# tornadowarnung.xyz/riotwatch/web/server/endpoint/static
vet: open $WORK/b121/vet.cfg: no such file or directory
open /tmp/go-build842273301/b115/vet.cfg: no such file or directory
open /tmp/go-build842273301/b001/vet.cfg: no such file or directory
# tornadowarnung.xyz/riotwatch/web/server
vet: open $WORK/b152/vet.cfg: no such file or directory
# tornadowarnung.xyz/riotwatch/web/server/endpoint/static
vet: open $WORK/b159/vet.cfg: no such file or directory

因此,某些软件包显示其构建失败:

FAIL    tornadowarnung.xyz/riotwatch/riot/static [build Failed]
FAIL    tornadowarnung.xyz/riotwatch/web/server [build Failed]
FAIL    tornadowarnung.xyz/riotwatch/web/server/endpoint [build Failed]
FAIL    tornadowarnung.xyz/riotwatch/web/server/endpoint/static [build Failed]

相关代码

func TestLoader_ProfileIcon(t *testing.T) {
    tempDir := os.TempDir()
    l := Loader{
        profileIconPath: tempDir,}
    defer os.RemoveAll(tempDir)

    t.Run("returns expected content",func(t *testing.T) {
        want := bytes.NewBufferString("image data")
        fileName := "123456"
        if err := createTestFile(t,tempDir,fileName,want); err != nil {
            t.Fatal(err)
        }

        got,err := l.ProfileIcon(123456)
        if err != nil {
            t.Error(err)
        }

        if !reflect.DeepEqual(got,want) {
            t.Errorf("got %v,want %v",got,want)
        }
    })

    t.Run("does not panic on missing file",func(t *testing.T) {
        res,err := l.ProfileIcon(-1)

        if err == nil {
            t.Errorf("Expected an error but got error %v and result %v",nil,res)
        }
    })
}

func createTestFile(t *testing.T,tempDir string,fileName string,content *bytes.Buffer) error {
    t.Helper()
    f,err := os.Create(path2.Join(tempDir,fmt.Sprintf("%v.png",fileName)))
    if err != nil {
        return err
    }
    _,err = f.Write(content.Bytes())
    if err != nil {
        return err
    }
    return nil
}

很难再现错误

在安装了1.15版本的Ubuntu计算机上,仅当我再次克隆存储库或清理测试缓存时,才会出现该错误

在本地运行Gitlab作业golang:alpine中使用的映像并运行相同的命令时,我无法每次都重现此错误。有时会发生,但大多数时候不会。

我尝试过的事情

我试图在1.13、1.14和1.15版本之间切换,但是每个版本都会产生相同的结果。

切换到任何其他图像,例如golang:latestgolang:1.14golang:1.13都无济于事。

我已尝试使用Google搜索来查找发生的错误,但没有找到任何相关结果或包含尚未尝试过的解决方案。

还原所述提交将使测试再次通过。我还还原了提交,并慢慢尝试手动再次引入更改。这会使问题再次发生。

解决方法

os.TempDir 不会为您创建新的临时目录,它返回系统的临时目录。通过对它调用 os.RemoveAll,您可以清除整个内容,包括构建和测试过程中使用的一些临时文件。

,

我可以验证MacOS上的行为。

os.TempDir()似乎有问题。

当我用os.Mkdir(...)自己创建目录时,您的测试就运行了。

您应该在Go存储库中创建一个Issue。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。