1

我正在测试一个使用 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'sEqual()不处理多个变量。有没有办法解决?评估两个返回值是不好的做法吗?

4

2 回答 2

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的详细信息,因此,您可以看到结果实际上有什么问题。在我看来,比较两个返回值是一种不好的做法,除非第二个是错误的。就像我在包装函数中所做的那样,您始终可以在一个语言构造(映射、切片、结构等)中组合多个返回值。我知道使用异步最终方法很难做到,但总的来说,我会尝试分别断言每个返回值。

于 2018-04-14T11:44:20.267 回答
0

gomega's doc中,已经说过可以使用多次返回。

您传递给最终的函数可以有多个返回值。在这种情况下,最终将第一个返回值传递给匹配器,并断言所有其他返回值都是 nil 或零值。这使您可以将 finally 与返回值和错误的函数一起使用——Go 中的常见模式

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

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

那应该可以解决问题。

编辑:

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

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

于 2018-04-14T11:22:50.473 回答