gpt4 book ai didi

go - 当 defer func 在 ginkgo 执行时

转载 作者:行者123 更新时间:2023-12-01 20:23:20 25 4
gpt4 key购买 nike

我正在用 ginkgo 重写我们的 k8s Controller 的单元测试。

和以前的 TDD 一样,对于每个测试,我们都会有类似的东西。

    // Create the Channel  object and expect the Reconcile
g.Expect(c.Create(context.TODO(), myObj)).NotTo(gomega.HaveOccurred())
defer c.Delete(context.TODO(),myObj)

我们想要的是,为测试创建一个对象,并在测试后将其从下划线簇中删除。

现在,在 ginkgo 上,我们正在容器的 spec 中运行测试。对我来说,container 是原始进程,如果是这种情况是否意味着 It 规范中定义的 defer 将在退出之前执行 container 而不是退出 It 规范。

例如,

var _ = Describe("my desr", func(){
It("a", func(){
fmt.Println(100)
defer func(){fmt.Println("a", 100)}()
})

It("b", func(){
fmt.Println(200)
defer func(){fmt.Println("b", 200)}()
})
})

结果会是:

一个

100
a100
200
b200

或者

b

100
200
b200
a100

就我而言,我肯定是第一个行为。或者我在获得 defer 行为方面走错了方向?我的意思是,我是否应该查看 BeforeEachAfterEach 方法?

最佳答案

您会看到第一个行为,因为 defer 的封闭范围与前面的 Println 是相同的匿名函数。 defer红色函数在退出作用域时被调用。

关于go - 当 defer func 在 ginkgo 执行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61014446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com