Go:测试不能通过?
Go: Test cannot pass?
我在通过此测试时遇到问题。问题是,我的结构中的 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
.
如果您继续使用指向 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
实例的 copy。
我在通过此测试时遇到问题。问题是,我的结构中的 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
.
如果您继续使用指向 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
实例的 copy。