我正在测试一个函数,以便使用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()不处理多个变量。有办法绕过这件事吗?评估两个返回值是错误的做法吗?
发布于 2018-04-14 11:44:20
您可以使用我根据您的伪代码编写的包装函数。
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-14 11:22:50
在's doc中,有人说可以使用多次返回。
您传递给的函数最终可以有多个返回值。在这种情况下,最终将第一个返回值传递给匹配器,并断言所有其他返回值都为零或零值。这允许您最终与返回值和错误的函数一起使用Go中的常见模式。
在您的代码中,您能更改这一行吗?
.Should(Equal((true, true))到.Should(Equal(true, true)。
这应该能解决问题。
编辑:
我忽略了Equal只接收一个接口参数。是我的错。
对于将来的参考,对于比较gomega的eventually中的多个值,结构的Array (或任何数据类型)都是有用的。
https://stackoverflow.com/questions/49828807
复制相似问题