如何修改代码使测试可访问函数执行的products属性(测试不可改)
解决购物车
addProducts返回值不满足测试需求的问题 我明白你的问题了——测试期望调用addProducts后返回的对象包含products属性,但当前你的实现返回的是Array.push()的结果(也就是添加元素后的数组长度,一个数字),这肯定没法通过测试。另外还有个隐藏问题:原来的_Cart是闭包内的单例,所有通过window[MODULE_NAME]()创建的购物车实例都会共享同一个产品列表,这显然不符合实际购物车的需求。
下面是修复后的完整实现代码:
(function() { var MODULE_NAME = 'shoppingcartModel'; window[MODULE_NAME] = function() { // 每个实例创建自己的购物车对象,避免共享 var _cart = { products: [], total: { beforeVAT: 0, afterVAT: 0, VAT: 0 } }; return { addProducts: function(newOrExistingProducts) { // 执行添加操作 _cart.products.push(newOrExistingProducts); // 返回包含products属性的购物车对象,满足测试的访问需求 return _cart; } }; }; })()
修改说明:
- 每个实例拥有独立购物车:把
_cart的定义移到工厂函数window[MODULE_NAME]()内部,这样每次调用创建购物车实例时,都会生成全新的购物车对象,不会和其他实例共享产品列表。 - 调整
addProducts的返回值:不再返回push的结果,而是返回当前的_cart对象——这个对象本身就带有products属性,完美匹配测试里_cart.products的访问方式。
这样修改后,你的测试代码就能正常通过了:调用_instance.addProducts(_product)会返回包含products数组的购物车对象,expect(_cart.products).toEqual([_product])的断言会成功。
内容的提问来源于stack exchange,提问作者volna
相关产品推荐
相关产品推荐

