在银杏树上执行延期功能时

问题描述 投票:1回答:3

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

作为以前的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是原始过程,如果是这样,是否意味着defer规范中定义的It将在退出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)}()
  })
})

结果将是:

a

100
a100
200
b200

b

100
200
b200
a100

就我而言,我绝对是第一个行为。还是我在获得defer行为方面走错了方向?我的意思是,我应该研究BeforeEachAfterEach方法吗?

我正在用银杏重写我们的k8s控制器的单元测试。作为以前的TDD,对于每个测试,我们都会有类似的东西。 //创建Channel对象,并期望协调g.Expect(c ....

go kubernetes ginkgo
3个回答
1
投票

您会看到第一个行为,因为defer的包围范围与先前的Println是相同的匿名函数。退出范围时,会调用defer red函数。


0
投票

您打算并行运行测试吗?如果是这样,那么结果将是不可预测的。在这种情况下,建议为每个进程使用单独的外部资源实例。


0
投票

“原始过程”与它无关。 ginkgo docs。在您的情况下,周围的功能是您的匿名Defer statements run when the surrounding function returns传递给func()(并由It调用)。

© www.soinside.com 2019 - 2024. All rights reserved.