在Func参数中,不能将Bytes.Buffer用作IO.Writerat类型



今天与GO挣扎..我不得不问的第二个问题。

我有2个测试可以测试写入功能Write(),该功能需要writer io.WriterAtcontent interface{}

我正在处理为该功能编写的(2(测试,TestWriteSuccessfulTestWriteFail

测试是我要获得的两个功能的错误:

cannot use &b (type *bytes.Buffer) as type io.WriterAt in argument to Write:

问题

实现我可以在这些测试中替换Bytes.buffer以使测试的功能?

什么?

我尝试过的

  1. b的类型更改为os.File- b.len() > 0失败。
  2. 广泛地搜索了如何测试io.writerat和实现它的功能,我发现的唯一一件事是bytes.buffer 不实现io.writerat,只有io.writer,但没有更多信息。
  3. 检查了godocs,我看到io.Writerat调用WriteAt并采用一小部分字节和一个偏移:WriteAt(p []byte, off int64) (n int, err error),我看到字节可用于调用Write,但没有有关WriteAt
  4. 的信息

代码

写功能:

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)
}

最新更新