为何单元测试闭包时出现“Function is unused”编译错误?
问题分析与解决
核心问题
你写的闭包结构是外层闭包返回了一个内层闭包,但这个内层闭包没有被执行,这就是编译器抛出“Function is unused”错误的原因。
原代码里,configuration.router.didSelectProduct被赋值为一个接受navigationController的闭包,这个闭包的返回值是另一个接受product的闭包——但如果没有任何代码去调用这个返回的内层闭包,编译器就会判定这个内层函数未被使用。
两种修正方案
方案1:合并闭包参数(最可能的正确写法)
如果didSelectProduct的定义是接受导航控制器+产品两个参数的闭包(类型类似((UINavigationController, Product) -> Void)?),直接把两个参数放在同一个闭包里:
configuration.router.didSelectProduct = { navigationController, product in let vc = More.build(navigationController: navigationController) navigationController.pushViewController(vc, animated: true) }
这样闭包逻辑直接在参数传入后执行,不会产生未使用的内层函数。
方案2:测试时正确调用嵌套闭包
如果didSelectProduct的定义确实是接受导航控制器后返回一个处理产品的闭包(类型类似((UINavigationController) -> ((Product) -> Void))?),那你在单元测试时必须完整调用两层闭包:
// 先传入导航控制器,拿到处理产品的内层闭包 let productHandler = configuration.router.didSelectProduct!(mockNavigationController) // 再传入产品,执行实际逻辑 productHandler(mockProduct)
如果你的测试代码只执行了外层闭包(传了导航控制器),但没调用返回的内层闭包,就会触发“Function is unused”错误。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

