模拟 go-logr 并验证它记录的消息?
Mock a go-logr and verify the message it logs?
我正在使用以下 go-logr/logr
库。
我有一个测试需要通过 logger as parameter
并检查它是否能够 记录发送的数据 。
我需要测试函数 GetConfig
:
config, err := GetConfig(FilePath, "ns", logger, "test" )
最后我需要在测试中打印一些来自记录器的消息
Expect(logger.msg).To(Equal("test"))
我的问题是应该怎么mock呢?
我试过以下但没有成功
func NewTestLogger() logr.Logger {
l := &testlogger{
Formatter: funcr.NewFormatter(funcr.Options{}),
}
return logr.New(l)
}
var _ = Describe(“test” action, func() {
It("action configuration with logger", func() {
//var t *testing.T
tl := NewTestLogger()
config, err := GetConfig(kcfgFilePath, "ns", tl, "test")
但是我无法从记录器打印值,我该怎么做才正确?
Something like
assert.Contains(t, tl.sink.Output, "test")
我应该使用测试包吗?
更新
这是一个工作版本没有断言。
不确定我错过了什么,因为我想断言来自 GetConfig
'tl` 输出的数据并获取键和值
这与我在产品中的代码很接近,我该如何工作?
https://go.dev/play/p/XDDkNjkESUw
我的问题是我应该如何断言以下内容
assert.Contains(t, tl.GetSink().WithName("Output"), "test")
assert.Contains(t, tl.GetSink().WithName("Output"), "message")
assert.Contains(t, tl.GetSink().WithName("Output"), "print something")
我能够得到如下数据,但不确定如何断言这些值
logr.New
函数接受 LogSink interface 的任何实现 - 这意味着您应该只实现一个将调用保存到切片 in-memory 而不是打印的实现,然后您可以希望该切片具有您的日志输出。
package main
import (
"testing"
"github.com/stretchr/testify/assert"
// ... some extra imports
)
type TestLogger struct {
Output map[string]map[int][]interface{}
r RuntimeInfo
}
func (t *TestLogger) doLog(level int, msg string, keysAndValues ...interface{}) {
m := make(map[int][]interface{}, len(keysAndValues))
m[level] = keysAndValues
t.output[msg] = m
}
func (t *TestLogger) Init(info RuntimeInfo) { t.r = info}
func (t *TestLogger) Enabled(level int) bool {return true}
func (t *TestLogger) Info(level int, msg string, keysAndValues ...interface{}) { t.doLog(level, msg, keysAndValues...) }
func (t *TestLogger) Error(err error, msg string, keysAndValues ...interface{}) { t.doLog(level, msg, append(keysAndValues, err)...) }
func (t *TestLogger) WithValues(keysAndValues ...interface{}) LogSink { return t}
func (t *TestLogger) WithName(name string) LogSink { return t }
func TestLoggerHasOutput(t *testing.T) {
l := &TestLogger{make(map[string]map[int][]interface[]), RuntimeInfo{1}}
tl := logr.New(l)
config, err := GetConfig(kcfgFilePath, "ns", tl, "test")
assert.Contains(t, l.Output, "ns") // you can also test the contents of the output as well
}
我正在使用以下 go-logr/logr
库。
我有一个测试需要通过 logger as parameter
并检查它是否能够 记录发送的数据 。
我需要测试函数 GetConfig
:
config, err := GetConfig(FilePath, "ns", logger, "test" )
最后我需要在测试中打印一些来自记录器的消息
Expect(logger.msg).To(Equal("test"))
我的问题是应该怎么mock呢?
我试过以下但没有成功
func NewTestLogger() logr.Logger {
l := &testlogger{
Formatter: funcr.NewFormatter(funcr.Options{}),
}
return logr.New(l)
}
var _ = Describe(“test” action, func() {
It("action configuration with logger", func() {
//var t *testing.T
tl := NewTestLogger()
config, err := GetConfig(kcfgFilePath, "ns", tl, "test")
但是我无法从记录器打印值,我该怎么做才正确?
Something like
assert.Contains(t, tl.sink.Output, "test")
我应该使用测试包吗? 更新
这是一个工作版本没有断言。
不确定我错过了什么,因为我想断言来自 GetConfig
'tl` 输出的数据并获取键和值
这与我在产品中的代码很接近,我该如何工作? https://go.dev/play/p/XDDkNjkESUw
我的问题是我应该如何断言以下内容
assert.Contains(t, tl.GetSink().WithName("Output"), "test")
assert.Contains(t, tl.GetSink().WithName("Output"), "message")
assert.Contains(t, tl.GetSink().WithName("Output"), "print something")
我能够得到如下数据,但不确定如何断言这些值
logr.New
函数接受 LogSink interface 的任何实现 - 这意味着您应该只实现一个将调用保存到切片 in-memory 而不是打印的实现,然后您可以希望该切片具有您的日志输出。
package main
import (
"testing"
"github.com/stretchr/testify/assert"
// ... some extra imports
)
type TestLogger struct {
Output map[string]map[int][]interface{}
r RuntimeInfo
}
func (t *TestLogger) doLog(level int, msg string, keysAndValues ...interface{}) {
m := make(map[int][]interface{}, len(keysAndValues))
m[level] = keysAndValues
t.output[msg] = m
}
func (t *TestLogger) Init(info RuntimeInfo) { t.r = info}
func (t *TestLogger) Enabled(level int) bool {return true}
func (t *TestLogger) Info(level int, msg string, keysAndValues ...interface{}) { t.doLog(level, msg, keysAndValues...) }
func (t *TestLogger) Error(err error, msg string, keysAndValues ...interface{}) { t.doLog(level, msg, append(keysAndValues, err)...) }
func (t *TestLogger) WithValues(keysAndValues ...interface{}) LogSink { return t}
func (t *TestLogger) WithName(name string) LogSink { return t }
func TestLoggerHasOutput(t *testing.T) {
l := &TestLogger{make(map[string]map[int][]interface[]), RuntimeInfo{1}}
tl := logr.New(l)
config, err := GetConfig(kcfgFilePath, "ns", tl, "test")
assert.Contains(t, l.Output, "ns") // you can also test the contents of the output as well
}