如何在Ginkgo测试用例中减少代码重复?
在Ginkgo中消除测试用例的中间代码重复
你可以直接在Describe节点的闭包内部定义共享工具函数,Ginkgo允许在这个闭包作用域内直接声明函数,或者将函数表达式赋值给变量——这些函数只会在当前Describe块的测试用例中生效,不会污染外部代码,完美解决中间逻辑重复的问题。
举个实际的代码示例:
var _ = Describe("UserService", func() { // 定义共享的中间逻辑函数,仅在当前Describe作用域内可用 verifyUserCreation := func(userID string) { // 这里是两个测试用例共享的中间断言逻辑 user, err := userService.GetUser(userID) Expect(err).NotTo(HaveOccurred()) Expect(user.Status).To(Equal("active")) Expect(user.CreatedAt).To(BeTemporally("~", time.Now(), time.Second*5)) } BeforeEach(func() { // 所有测试共用的起始初始化逻辑 userService = NewUserService(testDB) testDB.TruncateTables() }) It("creates a regular user successfully", func() { // 测试1特有的起始逻辑 req := CreateUserRequest{Type: "regular", Email: "user@example.com"} userID, err := userService.CreateUser(req) Expect(err).NotTo(HaveOccurred()) // 调用共享中间逻辑 verifyUserCreation(userID) // 测试1特有的结尾断言 user, _ := userService.GetUser(userID) Expect(user.Role).To(Equal("user")) }) It("creates an admin user successfully", func() { // 测试2特有的起始逻辑 req := CreateUserRequest{Type: "admin", Email: "admin@example.com"} userID, err := userService.CreateUser(req) Expect(err).NotTo(HaveOccurred()) // 调用共享中间逻辑 verifyUserCreation(userID) // 测试2特有的结尾断言 user, _ := userService.GetUser(userID) Expect(user.Role).To(Equal("admin")) }) })
如果共享逻辑不需要访问Describe块内的局部变量,也可以把函数定义在Describe块外部,但这会扩大函数作用域,建议只在多个Describe块都需要复用该逻辑时才这么做。另外,若共享逻辑依赖BeforeEach中初始化的变量,在Describe内部定义的函数可以直接访问这些变量,因为它们处于同一个闭包作用域中。
内容的提问来源于stack exchange,提问作者Tarun Gupta
相关产品推荐
相关产品推荐

