Gomega的Equal()可以处理多个值吗?

时间:2018-04-14 07:01:31

标签: unit-testing go ginkgo gomega

我正在测试一个函数,使用gomega向服务器发送模拟请求,我想验证1.请求已经开始2.请求已经完成。为此,我要归还两个布尔人。它们应该在下面的示例中评估为true,但值可能会发生变化。我试过这个:

g := gomega.NewGomegaWithT(t)
...
g.Eventually(func() (bool, bool) {
...
    start = false
    end = true

    if (request.status == "started") {
        start = true
    }
    if (request.status == "complete") {
        end = true
    }
    return start, end
}).Should(Equal((true, true))

但似乎gomega的Equal()不处理多个变量。有没有办法解决?评估两个返回值是不好的做法吗?

2 个答案:

答案 0 :(得分:0)

gomega's doc中,有人说可以使用多次返回。

  

您传递给最终的函数可以有多个返回   值。在这种情况下,最终将第一个返回值传递给   匹配器并声明所有其他返回值均为零或   零值。这允许您使用最终功能   返回一个值和一个错误 - Go中的常见模式

在您的代码中,您可以更改此行

.Should(Equal((true, true)).Should(Equal(true, true)

这应该解决问题。

修改

我忽略了Equal只接收一个接口参数。我的坏。

为了将来参考,为了比较gomega的eventually中的多个值,结构(或任何数据类型)的Array可能很有用。

答案 1 :(得分:0)

您可以使用我根据您的伪代码编写的包装函数

g := gomega.NewGomegaWithT(t)
...
testedFunc := func() (bool, bool) {
...
    start = false
    end = true

    if (request.status == "started") {
        start = true
    }
    if (request.status == "complete") {
        end = true
    }
    return start, end
}

g.Eventually(func() map[string]bool{
    r1,r2 := testedFunc()
    return map[string]bool{"start": r1, "end": r2}
}).Should(Equal(map[string]bool{"start": true, "end": true}))

我使用地图而不是简单的r1&r2来表示详细程度,因此,您可以看到结果的实际错误。在我看来,比较2个返回值是不好的做法,除非第二个是错误。您总是可以在单个语言构造(map,slice,struct等)中组合多个返回值,就像我在包装函数中所做的那样。我理解使用异步最终方法很难,但一般来说,我会尝试分别断言每个返回值。