去:测试不能通过? [英] Go: Test cannot pass?
问题描述
我在通过这个测试时遇到问题。问题是,我的结构中的 Write()
方法需要写入一个属性,但是 io.Writer
接口
filelogger.go:
pre>
包裹记录器
导入(
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))
}
测试输出:
--- 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, butio.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 theio.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 theWriterMock
instance.这篇关于去:测试不能通过?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!