今天与GO挣扎..我不得不问的第二个问题。
我有2个测试可以测试写入功能Write()
,该功能需要writer io.WriterAt
和content interface{}
。
我正在处理为该功能编写的(2(测试,TestWriteSuccessful
和TestWriteFail
。
测试是我要获得的两个功能的错误:
cannot use &b (type *bytes.Buffer) as type io.WriterAt in argument to Write:
问题
实现我可以在这些测试中替换Bytes.buffer以使测试的功能?
什么?我尝试过的
- 将
b
的类型更改为os.File
-b.len() > 0
失败。 - 广泛地搜索了如何测试io.writerat和实现它的功能,我发现的唯一一件事是bytes.buffer 不实现io.writerat,只有io.writer,但没有更多信息。
- 检查了godocs,我看到io.Writerat调用
WriteAt
并采用一小部分字节和一个偏移:WriteAt(p []byte, off int64) (n int, err error)
,我看到字节可用于调用Write
,但没有有关WriteAt
的信息
代码
写功能:
func Write(writer io.WriterAt, content interface{}) error {
data, err := json.Marshal(content)
if err != nil {
return err
}
writer.WriteAt(data, 0)
return nil
}
测试写功能(测试导入作证(:
func TestWriteSuccessful(t *testing.T) {
var b bytes.Buffer
err := Write(&b, exampleSystemConfig)
assert.Nil(t, err)
assert.True(t, b.Len() > 0)
}
func TestWriteFail(t *testing.T) {
var b bytes.Buffer
err := Write(&b, make(chan int)) // Write will return UnsupportedTypeError
assert.NotNil(t, err)
}
预期结果
两个测试成功。
实际结果
internal/platform/store/store_test.go:33:15: cannot use &b (type *bytes.Buffer) as type io.WriterAt in argument to Write:
*bytes.Buffer does not implement io.WriterAt (missing WriteAt method)
internal/platform/store/store_test.go:40:15: cannot use &b (type *bytes.Buffer) as type io.WriterAt in argument to Write:
*bytes.Buffer does not implement io.WriterAt (missing WriteAt method)
以进行测试的目的使自己的WriterAt
非常容易 - 这是任何类型的实现具有正确签名的WriteAt
功能。如果您只想知道编写的字节数,那么它可以像
type TestWriter struct {
BytesWritten int
}
func (tw *TestWriter) WriteAt(b []byte, _ int64) (n int, err error) {
tw.BytesWritten += len(b)
return len(b), nil
}
然后您可以使用
测试func TestWriteSuccessful(t *testing.T) {
var tw TestWriter
err := Write(&tw, exampleSystemConfig)
assert.Nil(t, err)
assert.True(t, tw.BytesWritten > 0)
}
func TestWriteFail(t *testing.T) {
var tw bytes.Buffer
err := Write(&tw, make(chan int)) // Write will return UnsupportedTypeError
assert.NotNil(t, err)
}