go - 当在银杏执行 defer func 时
问题描述
我正在用 ginkgo 重写我们的 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)}()
})
})
结果会是:
一个
100
a100
200
b200
或者
b
100
200
b200
a100
就我而言,我绝对是第一个行为。或者我在获得defer
行为方面的方向是错误的?我的意思是,我应该研究BeforeEach
andAfterEach
方法吗?
解决方案
您会看到第一个行为,因为 s 的封闭范围与之前的defer
s 是相同的匿名函数Println
。defer
退出范围时调用红色函数。
推荐阅读
- facebook-graph-api - localStorage,令牌是否必须字符串?
- verilog - 行为建模在 testbench.test 中不是有效的左值
- c - 如何在 C 中分别读取标志和文件名?(基于 WC 实用程序)
- r - 在R中将数字转换为日期格式?
- firebase - 如何访问 Document Snapshot 元素?
- html - Webpack 仅显示“应用就绪”。但不显示组件。如何解决?
- eclipse - RobotFrameWork 标准库没有出现在 Eclipse 中
- javascript - 简单的 Web3 安装
- python - ImportError:空间索引在 geopanda 中需要“rtree”或“pygeos”,但已安装 rtree
- google-tag-manager - GTM 中 Google Ads 的多个产品 ID 的正确语法