我在通過此測試時遇到問題。問題是,Write()我的結構中的方法需要寫入一個屬性,但io.Writer接口不接受指針作為其接收者。filelogger.go:package loggerimport ( "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 loggerimport ( "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.
1 回答

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
如果繼續使用一個指針來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()指針接收器,而不是值接收器。
因為一切都是由價值就通過,使用值接收器會讓一個副本中的WriterMock實例。
- 1 回答
- 0 關注
- 201 瀏覽
添加回答
舉報
0/150
提交
取消