我正在测试一个函数,使用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()
不处理多个变量。有没有办法解决?评估两个返回值是不好的做法吗?
答案 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等)中组合多个返回值,就像我在包装函数中所做的那样。我理解使用异步最终方法很难,但一般来说,我会尝试分别断言每个返回值。