首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >断言代码会对Logrus错误感到恐慌

断言代码会对Logrus错误感到恐慌
EN

Stack Overflow用户
提问于 2022-11-02 03:30:07
回答 1查看 21关注 0票数 2

在使用logrus时,您如何使用断言库(如using )来断言恐慌?

以下面的代码为例:

代码语言:javascript
复制
var mylogger = logrus.WithContext("MyLogger")

func LoadPreparedStatements() {
    db := psql.PsqlClient()
    var err error

    myPreparedStatement, err = db.Prepare("SELECT * FROM mytable")
    if err != nil {
        mylogger.Panic("Loading SQL Prepared Statement Failed")
    }
}

在使用error编写测试时,我只能捕获以下错误:

代码语言:javascript
复制
    PanicsWithError(t, "test", func() {
        LoadPreparedStatements()
    })
代码语言:javascript
复制
Panic value:    &logrus.Entry{Logger:(*logrus.Logger)(0xc0000ba000), Data:logrus.Fields{"context":"MyLogger"}, Time:time.Date(2022, time.November, 1, 21, 49, 27, 889501622, time.Local), Level:0x0, Caller:(*runtime.Frame)(nil), Message:"Loading SQL Prepared Statement Failed", Buffer:(*bytes.Buffer)(nil), Context:context.Context(nil), err:""}

有任何方法来测试返回的消息吗?

EN

回答 1

Stack Overflow用户

发布于 2022-11-02 03:30:07

除了写我自己的测试之外,我找不到任何方法来做这件事。我使用下面的代码来实现一个测试logrus响应的断言。如果所引发的错误不是来自logrus,它可能会有问题,但它允许我编写我想要的断言。

代码语言:javascript
复制
type tHelper interface {
    Helper()
}

// didPanic returns true if the function passed to it panics. Otherwise, it returns false.
func didPanic(f assert.PanicTestFunc) (didPanic bool, message interface{}, stack string) {
    didPanic = true

    defer func() {
        message = recover()
        if didPanic {
            stack = string(debug.Stack())
        }
    }()

    // call the target function
    f()
    didPanic = false

    return
}
func PanicsWithLogrusError(t assert.TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool {
    if h, ok := t.(tHelper); ok {
        h.Helper()
    }

    funcDidPanic, panicValue, panickedStack := didPanic(f)
    if !funcDidPanic {
        return assert.Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...)
    }
    panicErr, ok := panicValue.(*logrus.Entry)

    if !ok || panicErr.Message != errString {
        return assert.Fail(t, fmt.Sprintf("func %#v should panic with logrus error message:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, errString, panicErr.Message, panickedStack), msgAndArgs...)
    }

    return true
}
代码语言:javascript
复制
    PanicsWithLogrusError(t, "Loading SQL Prepared Statement Failed", func() {
        LoadPreparedStatements()
    })

以上所述使考试通过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74284053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档