我想测试 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
中的三个函数的函数中正确执行测试?
如果您想测试与文件的特殊交互,使用内存文件系统似乎很有用:
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)
}
}
内存文件系统还有其他实现,这只是一个例子。
请注意,您应该在测试和编码中添加错误处理。