为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信