无法在func参数中将bytes.Buffer用作io.WriterAt类型

时间:2019-08-02 20:41:29

标签: go

今天在忙着去..我不得不问的第二个问题。

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

我正在为该功能TestWriteSuccessfulTestWriteFail编写(2)个测试。

在测试时我遇到的两种功能的错误是:

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

问题

哪些 实现了WriterAt,我可以在这些测试中替换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),并且我看到bytes.Buffer可用于调用{{1 }},但没有有关Write
  4. 的信息

代码

写功能:

WriteAt

测试写入功能(测试导入Testify):

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

1 个答案:

答案 0 :(得分:1)

创建自己的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)
}