我正在用银杏重写我们的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
行为方面走错了方向?我的意思是,我应该研究BeforeEach
和AfterEach
方法吗?
我正在用银杏重写我们的k8s控制器的单元测试。作为以前的TDD,对于每个测试,我们都会有类似的东西。 //创建Channel对象,并期望协调g.Expect(c ....
您会看到第一个行为,因为defer
的包围范围与先前的Println
是相同的匿名函数。退出范围时,会调用defer
red函数。
您打算并行运行测试吗?如果是这样,那么结果将是不可预测的。在这种情况下,建议为每个进程使用单独的外部资源实例。
“原始过程”与它无关。 ginkgo docs。在您的情况下,周围的功能是您的匿名Defer statements run when the surrounding function returns传递给func()
(并由It
调用)。