今天在忙着去..我不得不问的第二个问题。
我有2个测试可以测试写函数Write()
,该函数需要writer io.WriterAt
和content interface{}
。
我正在为该功能TestWriteSuccessful
和TestWriteFail
编写(2)个测试。
在测试时我遇到的两种功能的错误是:
cannot use &b (type *bytes.Buffer) as type io.WriterAt in argument to Write:
哪些 实现了WriterAt,我可以在这些测试中替换bytes.Buffer以使测试正常工作?
b
的类型更改为os.File
-然后b.len() > 0
失败。WriteAt
并获取了一个字节片和一个偏移量:WriteAt(p []byte, off int64) (n int, err error)
,并且我看到bytes.Buffer可用于调用{{1 }},但没有有关Write
写功能:
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)
}
答案 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)
}