去:测试不能通过? [英] Go: Test cannot pass?

查看:159
本文介绍了去:测试不能通过?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在通过这个测试时遇到问题。问题是,我的结构中的 Write()方法需要写入一个属性,但是 io.Writer 接口

  filelogger.go:

包裹记录器

导入(
io


类型FileLogger结构{
文件io.Writer
}

func NewFileLogger(file io.Writer)* FileLogger {
return& FileLogger {file}
}

func(this * FileLogger)Log(消息字符串)error {
_,err:= this.File.Write([] byte(appendNewLine(message)))

return err
}

filelogger_test.go :

软件包记录器

导入(
测试

github.com/stretchr/testify/assert


类型WriterMock struct {
data [] byte
}

func(This WriterMock)Write(b [] byte)(n int ,错误错误){
this.data = append(this.data,b ...)

return len(this.data),nil
}

func NewMockedFileLogger()* FileLogger {
writer:= WriterMock {}

fileLogger:= FileLogger {writer}
$ b $ return& fileLogger


func TestLog(t * testing.T){
fileLogger:= NewMockedFileLogger()

fileLogger.Log(Hello World!)

assert.Equal(t,Hello World!,string(fileLogger.File。(WriterMock).data))
}
pre>

测试输出:

  --- FAIL:TestLog 0.00秒)
位置:filelogger_test.go:32
错误:不等于:Hello World! (预计)
!=(实际)

失败

正如我所提到的, data [] byte 没有被写入,因为我不能将函数接收器设置为指针,因为它不会满足 io.Writer

解决方案

/ em>到 WriterMock ,它应该可以工作:

  func NewMockedFileLogger )* FileLogger {
writer:=& WriterMock {}
fileLogger:= FileLogger {writer}
return& fileLogger
}

然后:

  assert.Equal(t ,Hello World!,字符串(fileLogger.File。(* WriterMock).data))

我错过了:

  func(this * WriterMock)Write(b [] byte)(n int,err error){


您需要调用 Write ()在指针接收器上,而不是接收值iver。

由于在Go中所有东西都被传值,所以使用值接收器将会使 WriterMock 实例的一个副本

I'm having a problem making this test pass. The problem is, the Write() method in my struct needs to write to a property, but io.Writer interface does not accept pointer as its receiver.

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))
}

Test Output:

--- FAIL: TestLog (0.00 seconds)
        Location:       filelogger_test.go:32
    Error:      Not equal: "Hello World!" (expected)
                    != "" (actual)

FAIL

As I mentioned, the data []byte is not being written to, because I cannot set the function receiver as a pointer, as it won't satisfty the io.Writer.

解决方案

If you keep using a pointer to WriterMock, it should work:

func NewMockedFileLogger() *FileLogger{
    writer := &WriterMock{}
    fileLogger := FileLogger{writer}
    return &fileLogger
}

Then:

 assert.Equal(t, "Hello World!", string(fileLogger.File.(*WriterMock).data))

I missed:

func (this *WriterMock) Write(b []byte) (n int, err error) {
...
}

You need to call Write() on a pointer receiver, not a value receiver.
Since everything is passed by value in Go, using a value receiver would make a copy of the WriterMock instance.

这篇关于去:测试不能通过?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆