如何使用 Go 中的 Write、WriteAt 和 Truncate 函数测试写入文件

问题描述 投票:0回答:1

我想测试 Golang 中的一个函数,该函数使用三种不同的方法写入文件:

Write
WriteAt
Truncate
。我知道的方法是使用buffer,但是buffer的方法
Truncate
和file方法不一样。

这是使用三个函数写入文件的代码:Write、WriteAt 和 Truncate

package main

import (
    "io"
    "os"
)

type Truncater interface {
    Truncate(size int64) error
}

type WriterFull interface {
    io.Writer
    io.WriterAt
    Truncater
}

func main() {

    fileName := "myFile"
    file, _ := os.Create(fileName)
    defer file.Close()

    WriteToTheFile(file)

}

func WriteToTheFile(file WriterFull) {

    file.Write([]byte("Ny text full of words"))
    file.WriteAt([]byte("M"), 0)
    file.Truncate(6)

}

根据这个来源,我需要

bytes.Buffer
来测试我的功能
WriteToTheFile(file WriterFull)
,*_test.go文件

package main

import (
    "bytes"
    "testing"
)

func TestWriteToTheFile(t *testing.T) {
    var buffer bytes.Buffer
    buffer.WriteString("Not my text")
    WriteToTheFile(&buffer)
}

我收到错误

cannot use &buffer (value of type *bytes.Buffer) as WriterFull value in argument to WriteToTheFile: *bytes.Buffer does not implement WriterFull (wrong type for method Truncate)
        have Truncate(int)
        want Truncate(int64) errorcompilerInvalidIfaceAssign

据我所知,不可能创建一个具有两个同名函数的接口,并且

file
buffer
不兼容,而第一个使用
Truncate(int64)
第二个使用有
Truncate(int)

如何在使用 var

file
Write
WriteAt
Truncate
中的三个函数的函数中正确执行测试?

unit-testing file go interface
1个回答
0
投票

如果您想测试与文件的特殊交互,使用内存文件系统似乎很有用:

package main

import (
    "testing"

    "github.com/spf13/afero"
)

func TestWriteToTheFile(t *testing.T) {
    t.Parallel()

    testFs := afero.NewMemMapFs()

    file, _ := afero.TempFile(testFs, "/", "*")
    fileName := file.Name()

    _, _ = file.WriteString("Not my text")
    WriteToTheFile(file)

    file.Close()

    got, _ := afero.ReadFile(testFs, fileName)
    expected := "Mot my"
    if string(got) != expected {
        t.Errorf("Got: %q, expected: %q", string(got), expected)
    }
}

内存文件系统还有其他实现,这只是一个例子。

请注意,您应该在测试和编码中添加错误处理。

© www.soinside.com 2019 - 2024. All rights reserved.