在 重构:改善既有代码的设计 (第2版) 中,构筑测试体系 – 待测试的示例代码的编写
1、一份有待测试的代码。这份代码来自一个简单的应用,用于支持用户查看并调整生产计划。它的(略显粗糙的)界面长得像下面这张图所示的这样。如图1
2、示例代码最终实现如下,入口的 productionPlan.html 文件代码如下
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8"> <title>构筑测试体系 - 待测试的示例代码</title> <style> </style> <script type="module" src="productionPlan.js"></script> </head> <body> </body> </html>
3、引入的模块 productionPlan.js 文件代码如下
function sampleProvinceData() { return { name: "Asia", producers: [ {name: "Byzantium", cost: 10, production: 9}, {name: "Attalia", cost: 12, production: 10}, {name: "Sinope", cost: 10, production: 6}, ], demand: 30, price: 20 }; } class Province { constructor(doc) { this._name = doc.name; this._producers = []; this._totalProduction = 0; this._demand = doc.demand; this._price = doc.price; doc.producers.forEach(d => this.addProducer(new Producer(this, d))); } addProducer(arg) { this._producers.push(arg); this._totalProduction += arg.production; } get name() { return this._name; } get producers() { return this._producers.slice(); } get totalProduction() { return this._totalProduction; } set totalProduction(arg) { this._totalProduction = arg; } get demand() { return this._demand; } set demand(arg) { this._demand = parseInt(arg); } get price() { return this._price; } set price(arg) { this._price = parseInt(arg); } get shortfall() { return this._demand - this.totalProduction; } get profit() { return this.demandValue - this.demandCost; } get demandCost() { let remainingDemand = this.demand; let result = 0; this.producers .sort((a, b) => a.cost - b.cost) .forEach(p => { const contribution = Math.min(remainingDemand, p.production); remainingDemand -= contribution; result += contribution * p.cost; }); return result; } get demandValue() { return this.satisfiedDemand * this.price; } get satisfiedDemand() { return Math.min(this._demand, this.totalProduction); } } class Producer { constructor(aProvince, data) { this._province = aProvince; this._cost = data.cost; this._name = data.name; this._production = data.production || 0; } get name() { return this._name; } get cost() { return this._cost; } set cost(arg) { this._cost = parseInt(arg); } get production() { return this._production; } set production(amountStr) { const amount = parseInt(amountStr); const newProduction = Number.isNaN(amount) ? 0 : amount; this._province.totalProduction += newProduction - this._production; this._production = newProduction; } } const asia = new Province(sampleProvinceData()); console.log(asia.shortfall);
3、代码 const asia = new Province(sampleProvinceData()); 参考:4.3 第一个测试示例。如图2
4、在浏览器中打开:http://localhost/refactoring/4/productionPlan.html ,查看控制台输出:5,符合预期。如图3
1 条回复
[…] […]