打個比方說,你有如下代碼:
var filterUsers = function(cb){
$.get('xxx-url')
.done(function(users){
var leftUsers = users.filter(user => user.age > 20);
cb(leftUsers);
});
};
這是一個非常簡單的,異步獲取用戶數據,并且過濾掉年齡小于等于20歲的人后,將剩下的用戶數據返回的方法。
那么現在我希望你寫一個測試用例,測試一下你的“過濾”部分的邏輯?怎么辦?這時候如果不修改filterUsers
源碼就很難測試了,因為里面耦合著真實的ajax
異步請求,莫非測試一個小小的“過濾”邏輯,你還要搭一個服務器給她,然后寫各種不同的數據返回的服務么?這也活得太累了。
但如果我們把獲取異步數據的部分提取出去,像這樣:
var UserService = require('./UserService');var filterUsers = function(cb){
UserService
.getUsers()
.done(function(users){ var leftUsers = users.filter(user => user.age > 20);
cb(leftUsers);
});
});
};
這時候里面不再耦合那個具體的異步操作,而是引入了一個叫UserService
的模塊,那當我們測試“過濾”部分邏輯的時候,只要替換掉這個UserService
,用一個返回假數據的模塊,就可以輕松的測試各種數據返回的情況下,“過濾”邏輯的工作狀況是否正常了。
這里就是把過濾用戶和獲取全部用戶數據兩個部分,解藕了哦!