亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go:測試不能通過?

Go:測試不能通過?

Go
一只斗牛犬 2021-09-20 15:05:10
我在通過此測試時遇到問題。問題是,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實例。


查看完整回答
反對 回復 2021-09-20
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號