小编典典

去:测试不能通过?

go

我在通过此测试时遇到问题。问题是,Write()我的结构体中的方法需要写入属性,但io.Writer接口不接受指针作为其接收者。

filelogger.go:

package logger

import (
    "io"
)

type FileLogger struct{
    File io.Writer
}

func NewFileLogger(file io.Writer) *FileLogger{
    return &FileLogger{file}
}

func (this *FileLogger) Log(message string) error {
    _, err := this.File.Write([]byte(appendNewLine(message)))

    return err
}

filelogger_test.go:

package logger

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

type WriterMock struct{
    data []byte
}

func (this WriterMock) Write(b []byte) (n int, err error) {
    this.data = append(this.data, b ...)

    return len(this.data), nil
}

func NewMockedFileLogger() *FileLogger{
    writer := WriterMock{}

    fileLogger := FileLogger{writer}

    return &fileLogger
}

func TestLog(t *testing.T) {
    fileLogger := NewMockedFileLogger()

    fileLogger.Log("Hello World!")

    assert.Equal(t, "Hello World!", string(fileLogger.File.(WriterMock).data))
}

测试输出:

--- FAIL: TestLog (0.00 seconds)
        Location:       filelogger_test.go:32
    Error:      Not equal: "Hello World!" (expected)
                    != "" (actual)

FAIL

正如我提到的,data []byte不会被写入,因为我无法将函数接收器设置为指针,因为它不能满足io.Writer


阅读 301

收藏
2020-07-02

共1个答案

小编典典

如果继续使用一个 指针WriterMock,它应该工作:

func NewMockedFileLogger() *FileLogger{
    writer := &WriterMock{}
    fileLogger := FileLogger{writer}
    return &fileLogger
}

然后:

 assert.Equal(t, "Hello World!", string(fileLogger.File.(*WriterMock).data))

我错过了:

func (this *WriterMock) Write(b []byte) (n int, err error) {
...
}

您需要调用Write()指针接收器,而不是值接收器。
由于所有内容都是通过Go中的值传递的,因此使用值接收器将 复制WriterMock实例。

2020-07-02