ColdBox TDD单元测试报错:变量[POPULATOR]不存在问题求助
ColdBox TDD单元测试报
variable [POPULATOR] doesn't exist修复方案 报错由业务代码的闭包作用域问题、测试代码的写法错误共同导致,按以下步骤修改即可解决:
1. 修复业务代码的闭包上下文丢失问题
CFML中数组map方法的闭包默认不会绑定当前组件的执行上下文,你在闭包内直接调用注入的populator、自定义的new()方法时,实际是在空作用域下查找变量,自然会报变量不存在。
修改服务层getAllUsers相关代码,提前把闭包内要用到的对象引用存到局部作用域,避免上下文丢失:
User function new(){ return wirebox.getInstance("User"); } function getAllUsers(){ // 提前缓存闭包内需要用到的引用,规避作用域问题 var populator = variables.populator; var getNewUser = this.new; var users = queryExecute( "SELECT * FROM USERS", {}, {returnType="array"} ).map(function(userRow){ return populator.populateFromStruct(getNewUser(), userRow); }); return users; }
2. 修正单元测试的错误写法
你写的测试代码有三处明显问题,直接修正即可:
- 方法名不匹配:服务层定义的方法是
getAllUsers(),测试中错误调用了不存在的getAll()方法 - 依赖初始化逻辑冗余:
BaseModelTest的setup()方法已经完成了模型实例化、基础依赖注入的工作,额外手动调用model.init()很可能覆盖掉已经注入的依赖,导致属性丢失 - 断言逻辑错误:
getAllUsers()是直接返回用户数组,没有向event对象写入私有值,不需要调用event.getPrivateValue()取值;另外单元测试需要mock数据库查询操作,不能直接执行真实SQL - 补充mock逻辑:除了populator,还需要mock全局的
queryExecute方法返回测试数据,避免测试依赖真实数据库环境
修正后的测试代码如下:
component extends="coldbox.system.testing.BaseModelTest" model="models.UserService"{ /*********************************** LIFE CYCLE Methods ***********************************/ function beforeAll(){ super.beforeAll(); super.setup(); // 移除多余的model.init()调用,避免覆盖注入的依赖 } function afterAll(){ super.afterAll(); } /*********************************** BDD SUITES ***********************************/ function run(){ describe( "Users Suite", function(){ it( "can get list of users", function(){ // mock数据库查询返回测试数据,不碰真实库 mockGlobal().$("queryExecute", [ {id=1, username="zhangsan"}, {id=2, username="lisi"} ]); // 注入populator的桩对象 var stubPopulator = stub().$("populateFromStruct", {}); model.$property("populator", "variables", stubPopulator); // 调用正确的方法名,直接接收返回值 var users = model.getAllUsers(); // 断言返回结果符合预期 expect(users).toBeArray(); expect(users.len()).toBe(2); // 验证populator的填充方法确实被调用 expect(stubPopulator.$callCount("populateFromStruct")).toBe(2); }); }); } }
改完之后重新运行测试,populator不存在的报错就会消失,测试可以正常执行。
内容的提问来源于stack exchange,提问作者Undecided Dev
相关产品推荐
相关产品推荐

