我在通过此测试时遇到问题。问题是,Write()我的结构体中的方法需要写入属性,但io.Writer接口不接受指针作为其接收者。
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。
data []byte
如果继续使用一个 指针 来WriterMock,它应该工作:
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实例。