【问题标题】:Custom testify output for failing test of xml / stringsxml / 字符串测试失败的自定义证明输出
【发布时间】:2016-08-03 11:41:03
【问题描述】:

我正在使用 testify 测试 XML 编组,并使用 strings.Contains 检查我希望包含在 XML 中的行是否确实存在。

但是,我想区分实际与所需的 xml。

目前,我的代码如下所示:

func (suite *BookSuite) TestXMLMarshal() {
    priceXML, priceErr := xml.Marshal(PriceType{Price: 10, Type: "IND"})

    suite.Nil(priceErr)
    linePresent := strings.Contains(string(priceXML), `<PriceType Price="10" Type="IND"></PriceType>`)

    if true != linePresent {
        err := errors.New("Expected: \n" + `<PriceType Price="10" Type="IND"></PriceType>` + "\nGot: \n" + bookString)
        suite.Error(err, err.Error())
        fmt.Println(err)
    }
}

xml 文件中的行数比测试中的单行多,因此您可以想象 if 语句会很粗。关于清理这个更可扩展的任何想法?

【问题讨论】:

    标签: testing go testify


    【解决方案1】:

    除非格式很重要,否则测试 xml.Marshal 之类的快速彻底的方法是编组和比较对象

    func (suite *BookSuite) TestXMLMarshal() {
    
        priceXML, priceErr := xml.Marshal(PriceType{Price: 10, Type: "IND"})
    
        suite.Nil(priceErr)
    
        var secondPrice PriceType
        unerr :=  xml.Unmarshal(priceXML, &secondPrice)
        suite.Nil(unerr)
    
        if !reflect.DeepEqual(&priceXML,&secondPrice){
            err := fmt.Errorf("Expected: '%+v'\nGot: %+v\n",priceXML,secondPrice)
            suite.Error(err, err.Error())
            fmt.Println(err)
        }
    }
    

    未经测试,但应该是这样的。

    【讨论】:

    • 谢谢马特。但我们确实想测试 XML 的实际格式,因为它被指定 xml 格式的第 3 方使用(我们必须跳过一些环节)。有什么想法可以合并吗?
    • 除非有一些奇怪的空白要求,否则我会执行上述操作,然后对 xml 输出执行 xml prettyprint/canonicalization。大多数使用 xml 的应用程序不关心空格(因为 xml 库级别的逻辑通常会处理它)。如果您需要更多控制编码/xml 有 Encoder.Indent 来控制输出的空白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2016-05-23
    • 1970-01-01
    • 2021-05-19
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多