Go 在执行延迟功能时

Go 在执行延迟功能时,go,kubernetes,ginkgo,Go,Kubernetes,Ginkgo,我正在用银杏重写k8s控制器的单元测试 正如前面的TDD一样,对于每个测试,我们都会有如下内容 //创建通道对象并期望协调 g、 Expect(c.Create(context.TODO(),myObj)).NotTo(gomega.haveoccurrent()) 延迟c.Delete(context.TODO(),myObj) 我们需要的是,为测试创建一个对象,并在测试后将其从underline集群中删除 现在,在gingo上,我们正在容器的spec中运行测试。对我来说,容器是原始流程,如

我正在用银杏重写k8s控制器的单元测试

正如前面的TDD一样,对于每个测试,我们都会有如下内容

//创建通道对象并期望协调
g、 Expect(c.Create(context.TODO(),myObj)).NotTo(gomega.haveoccurrent())
延迟c.Delete(context.TODO(),myObj)
我们需要的是,为测试创建一个对象,并在测试后将其从underline集群中删除

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

比如说,

var=descripe(“我的设计”,func(){
它(“a”,func(){
fmt.Println(100)
defer func(){fmt.Println(“a”,100)}()
})
它(“b”,func(){
fmt.Println(200)
defer func(){fmt.Println(“b”,200)}()
})
})
结果会是:

a

100
a100
200
b200

b

100
200
b200
a100

在我的情况下,我肯定什么是第一个行为。或者我在获得
延迟
行为方面走错了方向?我的意思是,我应该在每次之前和每次之后查看
吗?

您计划并行运行测试吗?如果是这样,那么结果将是不可预测的。在这种情况下,建议为每个流程提供一个单独的外部资源实例

我建议你看看是怎么做的。我相信,他们创造了新的控制平面,每次都被称为。如各国所述:

并行运行时,每个并行进程将在PreforeSuite和AfterSuite函数之前运行


您是否计划并行运行测试?如果是这样,那么结果将是不可预测的。在这种情况下,建议为每个流程提供一个单独的外部资源实例

我建议你看看是怎么做的。我相信,他们创造了新的控制平面,每次都被称为。如各国所述:

并行运行时,每个并行进程将在PreforeSuite和AfterSuite函数之前运行


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

您将看到第一个行为,因为
defer
s的封闭作用域与前面的
Println
是相同的匿名函数<代码>延迟
红色函数在退出作用域时被调用。

“原始进程”与此无关。在您的例子中,周围的函数是您的匿名
func()
传递给它(并由它调用)

“原始进程”与此无关。在您的例子中,周围的函数是您的匿名
func()
传递给(并由其调用)
It

谢谢提醒,我正在查看envtest。谢谢提醒,我正在查看envtest。