摘要:的測試不管在用還是都是很頭疼的事情但是自從有了一口氣寫個測試腰也不疼了頭也不疼了只需要個理由在說用測為什么好之前我們先來看我們要測的一個例子栗子比如我要寫一個模塊要去取用戶的和他所有的數(shù)量那么我們應該有一個的我們還需要一個的大同小異略去最后
from oyanglul.us
Javascript 的測試, 不管在用 jasmine 還是 mocha,
都是很頭疼的事情. 但是自從有了 jest, 一口氣寫7個測試, 腰也不疼了, 頭也不疼了.
只需要 3 個理由
在說用 jest 測為什么好之前,我們先來看我們要測的一個例子.
栗子比如我要寫一個模塊要去取github 用戶的follower 和他所有 repo 的 follower 數(shù)量.
那么我們應該有一個 User 的 Model.
// user.js var $ = require("jquery"); function User(name) { this.name = name; this.followers = 0; } User.prototype.fetch = function(){ return $.ajax({ url: "https://api.github.com/users/" + this.name, method: "get", dataType: "json" }).then(function(data){ this.followers = data.followers; }.bind(this)); }; module.exports = User;
我們還需要一個 repo 的 model, 大同小異略去
最后, 整合這倆我要的東西, 并顯示在頁面上
// follower.js var $ = require("jquery"); function followerOf(user, repo) { user.fetch().then(repo.fetch).then(function(_){ $("#content").text(user.name +""s followers: " + user.followers + " and his repo "+ repo.name +""s followers:" + repo.followers); }); }; module.exports = followerOf;
--
1. Auto Mock自動 mock 實在是最大的亮點, jest 重寫了 require, 所以你的代碼里的所有 require 來的東西都自動 mock.
因為在你的測試中往往只關心一個模塊, 對于他的所有依賴其實都是無所謂的.
在例子中, 如果我們在測 repo.js 的時候完全不關心那兩個 jquery 的 ajax 方法到底
寫對沒寫對,反正我們期望能從 ajax 里面拿到我們想要的東西就對了. 因此, 我希望 jquery 的
所有方法都是 mock 的. jest 讓你很輕松的做到這點, 因為是自動mock所有require 的東西, 而
對于目標測試模塊, 只需要說我dontMock 我的目標模塊就好了.
jest.dontMock("../repo"); describe("Repo Model", function(){ var repo; beforeEach(function(){ var $ = require("jquery").setAjaxReturn({stargazers_count: 23}); var Repo = require("../repo"); repo = new Repo("jcouyang", "gira"); }); it("should populate properties with data from github api", function(){ repo.fetch(); expect(repo.followers).toBe(23); }); });
所以這個測試看起來就跟文檔一樣了,
dontMock("./repo") 說明我關心repo
這個模塊, 其他我都不 care.
before 是我要進行操作所需要的東西.
我要 jquery ajax 請求給我想要的數(shù)據(jù)
我要一個我要測的 Repo 類的實例
it 說明我關心地行為是神馬
我關心 fetch 的行為,是去取數(shù)據(jù)并給我把數(shù)據(jù)填充到我的 repo 實例中
你可能要問 segAjaxReturn 是哪里冒出來的. 忍一忍稍后告訴你.
有沒有看雖然我顯式的 mock jquery, 但是 Repo 里面 require 的 jquery 其實是假的, 不然我們就真的訪問
github api 了. 那樣就不會每次都返回 23 個 follower 了.
好了現(xiàn)在我們來測 follower.js, 先看 follower 到底干了什么, 拿到 user 和 repo
的信息然后組成一句話放到頁面 id 為 content 的元素下面.
好, 所以我們關心
- 組出來的話對不對
- 有沒有放到 content 元素下, 所以 jquery 的操作對不對也是我們關心的一部分
我們不關心
- user 干了什么
- repo 干了什么
這樣,關心的就是不能 mock 的
jest.dontMock("../follower") .dontMock("jquery"); describe("follower", function(){ var user, repo, follower; var $ = require("jquery"); beforeEach(function(){ var Repo = require("../repo"); var User = require("../user"); follower = require("../follower"); user = new User("jcouyang"); repo = new Repo("jcouyang", "gira"); // 我們不關心 user, 但是我們希望他能返回一個 deferred 類型 user.fetch.mockReturnValue($.Deferred().resolve("dont care")); // 我們讓我們不關心的 user 和 repo 返回我們期望的東西就好 user.name ="jcouyang"; user.followers = 20; repo.name = "gira"; repo.followers = 21; // 期待頁面上有一個 id 為 content 的元素 document.body.innerHTML = " "; }); it("should populate properties with data from github api", function(){ follower(user,repo); // 希望 content 上能得到想要的內容 expect($("#content").text()).toBe("jcouyang"s followers: 20 and his repo gira"s followers:21"); }); });3. Manual Mock
好了, 說好的解釋 setAjaxReturn是怎么回事的
嗯嗯, 是這樣的, 雖然 jest 自動 mock 了我們不關心的模塊, 但是我們還是會希望
這個 mock 的玩意能有一些我們期望的行為, 也就是按我們的期望返回一些東西. 比如
這里就是我們不關心 ajax 的邏輯, 但是我們需要他能給我們返回一個東西,并且可以
thenable. 所以單純的 mock 對象或函數(shù)都不能做到, 所以有了 manual mock 這種東西.
用 manual mock 需要建一個__ mocks__ 文件夾,然后把所有的 mock 都扔進去. 比如
我想 mock jquery, 那么我建一個jquery.js 扔進去
var data = {}; var mockDefered = function(data){ return { then: function(cb){ return mockDefered(cb(data)); } }; }; function ajax() { return mockDefered(data); } function setAjaxReturn(shouldbe){ data = shouldbe; } exports.setAjaxReturn = setAjaxReturn; exports.ajax = ajax;
終于看見setAjaxReturn在哪里定義了:sweat_smile: 這里暴露兩個函數(shù)
- setAjaxReturn: 可以設置我希望 ajax 返回的值
- ajax: 單純的返回這個 thenable.
所以我也不需要顯示的聲明 mock jquery什么什么的, 直接在測試里設置ajax 的返回值就好了.
var $ = require("jquery").setAjaxReturn({stargazers_count: 23});
這是 repo 里面 require 的 jquery 已經(jīng)被 mock 并且只要掉 ajax 都會返回我
期望的值.
并行測試:
還用說么, 既然已經(jīng)如此模塊化好了, user repo 以及 follower 的測試完全是互不依賴.
沒有什么理由一個一個測. 因此3個測試的耗時取決于最長時間的那個. 所以如果有
那個測試特別耗時,說明模塊還不夠細, 多拆幾個就快了.
promise: 使用 pit() 來測試 thenable 的對象, 比如 repo 的例子,就 keyi
寫成
pit("should populate properties with data from github api", function(){ return repo.fetch().then( expect(repo.followers).toBe(23); ); });
Timer mocks: 可以使用 mock 的 timer 和 ticks, 也就是你可以加速
所有的setTimeout, setInterval, clearTimeout, clearInterval行為. 不需要等待.
setTimeout(function() { callback(); }, 1000); expect(callback).not.toBeCalled(); jest.runAllTimers(); expect(callback).toBeCalled()Wrapup
所以說白了, jest 其實也是個概念, 推薦使用模塊化的思想, 這樣我只需要保證每個接口的 IO 正確, 就可以保證整個程序沒問題. 這樣劃分下來測試就會變得簡單到只需要關心當然模塊的 IO 從而
可以 mock 掉所有其他依賴. 真正模塊化好的代碼單純的只用 jasmine 或者 mocha
都應該是很好測的. 只是在這個概念之上省去了很多不必要的 mock 代碼, 因為要 mock 的
依賴總是占大多數(shù)的, 而關心的, 往往只是那么一兩個.
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/85270.html
摘要:開發(fā)者的終極配置原文作者原文鏈接根據(jù)多年以來不斷完善配置的經(jīng)驗,決定這次給也來一個大改造??旖萱I幫助開發(fā)人員在不同的編輯器之間保持一致的編碼風格。一組專注,用于優(yōu)化現(xiàn)代開發(fā)生產(chǎn)力的命令集,目標是符合推薦的代碼規(guī)范。 JS/React 開發(fā)者的 Atom 終極配置 原文作者:Elad Ossadon 原文鏈接:The Ultimate Atom Editor Setup (+for J...
摘要:包包含由團隊提供的測試實用程序。將在一個名為的目錄中自動查找整個樹中的測試文件是的帶有下劃線。讓我們?yōu)闀r間軸組件創(chuàng)建第一個測試。其中之一是命令。現(xiàn)在我們已經(jīng)編寫了第一個測試并確認了我們的設置我們將在明天開始測試我們的時間軸組件。 本文轉載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3807原文:https://www.fullstac...
摘要:在年成為最大贏家,贏得了實現(xiàn)的風暴之戰(zhàn)。和他的競爭者位列第二沒有前端開發(fā)者可以忽視和它的生態(tài)系統(tǒng)。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發(fā)人員檢查所有端點。 2016 JavaScript 后起之秀 本文轉載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...
摘要:轉載自樓主個人博客和入門初探在和作比較的時候兩者主要的不同就是的集成度比較高內置斷言庫而需要搭配額外的斷言庫在此選擇了比較流行的作為斷言庫風格的選擇其中又有好幾種斷言風格我們經(jīng)常見到的其實就是風格的其中我較喜歡因為它可以直接以屬性的方式嵌入 轉載自樓主個人博客 Mocha 和 Chai 入門初探 Chai 在和 jest 作比較的時候, 兩者主要的不同就是 jest 的集成度比較高內置...
摘要:測試調用斷言的執(zhí)行后返回斷言被調用斷言被調用了一次斷言傳入的參數(shù)為所創(chuàng)建的函數(shù)還可以設置返回值,定義內部實現(xiàn)或返回對象。 在本篇教程中,我們會介紹 Jest 中的三個與 Mock 函數(shù)相關的API,分別是jest.fn()、jest.spyOn()、jest.mock()。使用它們創(chuàng)建Mock函數(shù)能夠幫助我們更好的測試項目中一些邏輯較復雜的代碼,例如測試函數(shù)的嵌套調用,回調函數(shù)的調用等...
閱讀 1276·2021-10-18 13:32
閱讀 2355·2021-09-24 09:47
閱讀 1336·2021-09-23 11:22
閱讀 2473·2019-08-30 14:06
閱讀 579·2019-08-30 12:48
閱讀 2010·2019-08-30 11:03
閱讀 546·2019-08-29 17:09
閱讀 2473·2019-08-29 14:10