【发布时间】:2022-01-03 04:21:20
【问题描述】:
跟进问题至:How do I guarantee that the request happened correctly when mocking an API?
main.go
package main
import (
"net/http"
)
func SomeFeature(host, a string) {
if a == "foo" {
resp, err := http.Get(host + "/foo")
}
if a == "bar" {
resp, err := http.Get(host + "/baz"))
}
// baz is missing, the test should error!
}
main_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestSomeFeature(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
}))
testCases := []struct {
name string
variable string
}{
{
name: "test 1",
variable: "foo",
},
{
name: "test 2",
variable: "bar",
},
{
name: "test 3",
variable: "baz",
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
SomeFeature(server.URL, tc.variable)
// assert that the http call happened somehow?
})
}
}
- 去游乐场:https://go.dev/play/p/EFanSSzgnbk
- 如何断言每个测试用例都向模拟服务器发送请求?
- 如何断言请求未发送?
同时保持测试并行/并发?
【问题讨论】:
-
你得到并接受了最后一次被问到的答案,减去并发部分。您的示例代码未使用该答案中描述的任何方法,并且您再次询问有关检查是否进行了调用的相同问题。考虑到上一个问题的答案后,您能否澄清您的问题是什么以及您仍然缺少什么?
-
上一个问题不处理并发,所以我正在寻找一种方法来处理它。据我所知,使用上一个答案中的变量会导致竞争条件,所以我想知道应该如何完成?我已经看到它使用多路复用器和通道完成,但我想知道正确的方法是什么。
-
然后展示处理检查的实现,人们可以帮助您确保它同时工作。在您问题的示例中,没有进行这些检查,因此无法帮助更改它们的完成方式。
-
@Adrian 如果我不知道该怎么做,我该怎么做?举一个检查的例子,我必须实现这个答案stackoverflow.com/a/70102527/175071,这会破坏问题的目的还是我错了?
-
它似乎不会破坏目的。你的问题似乎是“我如何同时做这件事”,如果你的示例代码正在做这件事,这更容易回答。