摘要:介紹使用,就可以測試指定的案例加入可以進行測試異步模塊的案例安裝全局配置命令行配置加載框架引入。
介紹
安裝使用 karma + Jasmine,就可以測試指定的案例, 加入RequireJS, 可以進行測試異步模塊的案例
# Install Karma: $ npm install karma --save-dev # Install plugins that your project needs: $ npm install karma-jasmine karma-chrome-launcher jasmine-core --save-dev # Install karma-requirejs $ npm install requirejs --save-dev $ npm install karma-requirejs --save-dev
全局配置karma 命令行
npm install -g karma-client配置
module.exports = function (config) { config.set({ // ... frameworks: ["jasmine", "requirejs"], files: [ {pattern: "lib/**/*.js", included: false}, {pattern: "src/**/*.js", included: false}, {pattern: "test/**/*[sS]pec.js", included: false}, "test-main.js" ] // ... }) }
加載karma-jasmine, karma-requirejs 框架, 引入 test-main.js. files。
test-main.js 介紹var allTestFiles = [] // 測試文件 var TEST_REGEXP = /(spec|test).js$/i // Get a list of all the test files to include // 解析files 和 frameworks 對應需要加載的文件 Object.keys(window.__karma__.files).forEach(function (file) { if (TEST_REGEXP.test(file)) { // Normalize paths to RequireJS module names. // If you require sub-dependencies of test files to be loaded // as-is (requiring file extension) // then do not normalize the paths // 將符合條件的測試文件轉化為 requirejs 能加載的模塊名 var normalizedTestModule = file.replace(/^/base/|.js$/g, "") allTestFiles.push(normalizedTestModule) } }) require.config({ // Karma serves files under /base, which is the basePath from your config file // karma 將basePath 對應的靜態路徑設置為 /base // requirejs 加載文件也應當由 /base 開始 baseUrl: "/base", // dynamically load all test files // 動態加載測試文件 deps: allTestFiles, // we have to kickoff jasmine, as it is asynchronous // deps 加載完后 執行 單元測試 callback: window.__karma__.start })簡單demo
目錄結構
- test - src - lib - test-main.js - index.html - main.js
源文件 src/utils/qs.js
define(function () { var encodeURIComponent = window.encodeURIComponent; var decodeURIComponent = window.decodeURIComponent; function isArray (o) { return Object.prototype.toString.call(o) === "[object Array]"; } function isObject (o) { return Object.prototype.toString.call(o) === "[object Object]"; } return { parse: function (url) { if (typeof url !== "string") { throw new TypeError("qs.parse() Error, url should transmit a string param"); } var result = {}; url = url.substr(url.indexOf("?") + 1); var querystring = url.replace(/#.*/, ""); var patterns = querystring.split("&"); patterns.forEach(function(pattern) { if (!pattern) { return; } var matched = pattern.match(/([^=]+)=(.*)/); if (!matched) { return; } var key = matched[1], value = matched[2], isArr = false; if (key.slice(-2) === "[]") { key = key.slice(0, -2); isArr = true; } key = decodeURIComponent(key); value = decodeURIComponent(value); if (isArr) { if (!Array.isArray(result[key])) { result[key] = []; } result[key].push(value); } else { result[key] = value; } }, this); return result; }, stringify: function (obj) { if (!isObject(obj)) { throw new TypeError("qs.stringify() Error, Unexpected obj is not Object"); } return Object.keys(obj).map(function (name, index) { if (isArray(obj[name])) { return obj[name].map(function (item) { return encodeURIComponent(name) + "[]=" + encodeURIComponent(item); }).join("&"); } return encodeURIComponent(name) + "=" + encodeURIComponent(obj[name]); }).join("&"); } } });
測試文件 test/utils/qsSpec.js
define(["src/utils/qs"], function(qs) { beforeAll(function () { spyOn(qs, "parse").and.callThrough(); spyOn(qs, "stringify").and.callThrough(); }); describe("qs.parse() suite", function() { it("should throw TypeError", function() { expect(qs.parse).toThrowError(TypeError); }); it("should parse to object", function () { var url = "http://liylblog.com/?a=1&b=2&c=3"; expect(qs.parse(url)).toEqual({ a: "1", b: "2", c: "3" }); }); it("should parse to object array", function () { var url = "http://liylblog.com/?a[]=1&a[]=2&a[]=3"; expect(qs.parse(url)).toEqual({ a: ["1", "2", "3"] }); }); it("should be decodeURIComponent", function () { var aVal = window.encodeURIComponent("=1"); var bVal = window.encodeURIComponent("?2"); var url = "http://liylblog.com/?a=" + aVal + "&b=" + bVal + "&c=3#"; expect(qs.parse(url)).toEqual({ a: "=1", b: "?2", c: "3" }); }); }); describe("qs.stringify() suite", function () { var obj; beforeEach(function () { obj = { a: 1, b: ["你好", "世界"], c: ["2", null, ""] }; }); afterEach(function () { obj = null; }); it("should throw TypeError", function() { expect(qs.stringify).toThrowError(TypeError); }); it("should stringify obj", function () { var querystring = qs.stringify(obj); var containB = (function () { var str = "" for (var i = 0, len = obj["b"].length; i < len; i++) { str += i > 0 ? "&" : "" str += "b[]=" + encodeURIComponent(obj["b"][i]) } return str; })(); var containC = "c[]=null"; expect(querystring).toContain("a=1") expect(querystring).toContain(containB); expect(querystring).toContain(containC); }); }); });執行
karma start ./karma.conf.js
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88609.html
摘要:前言配合進行單元測試,存在官方版本,版本雖然陳舊,但是功能實現沒有問題。單元測試中配置文件與實際存在差異,所以單元測試保證模塊的可靠性,具體生產環境下注意模塊可正常加載就好。。為單元測試而安裝的模塊。 如有排版效果混亂,請移步https://www.zybuluo.com/bornkiller/note/24759。 前言 karma配合requirejs進行單元測試,存在官方版...
摘要:核心功能就是啟動一個服務并監聽項目文件改變,文件改變后再刷新服務器。 Karma 簡介 Karma是Testacular的新名字,在2012年google開源了Testacular,2013年Testacular改名為Karma。Karma是一個讓人感到非常神秘的名字,表示佛教中的緣分,因果報應,比Cassandra這種名字更讓人猜不透! Karma是一個基于Node.js的JavaS...
摘要:還記得一年半前轉向后端的那種無助的感覺,獨自一人摸黑走路,學習各種前端知識,走了不少彎路,現在終于算是入門了前端我相信不少人也有我當時同樣的無助,所以我在空閑時間整理了下所用到的知識,便編寫了一個手腳架,希望能給其他正學習前端的同學一些參考 還記得一年半前轉向后端的那種無助的感覺,獨自一人摸黑走路,學習各種前端知識,走了不少彎路,現在終于算是入門了前端~我相信不少人也有我當時同樣的無助...
摘要:主要完成一下工作啟動一個服務器,生成包含源代碼和測試腳本的頁面運行瀏覽器加載頁面,并顯示測試的結果如果開啟檢測,則當文件有修改時,執行繼續執行以上過程。如果我們引入了一些其它的庫,比如之類的,將源代碼和庫代碼打包在一起后,覆蓋率會更難看。。 前言 在前端開發中,測試常常是被忽略的一環。因此最近在研究前端自動化測試框架Karma,把個人的學習過程分享出來,希望對大家有幫助。 什么是Kar...
閱讀 3564·2023-04-26 00:05
閱讀 954·2021-11-11 16:55
閱讀 3523·2021-09-26 09:46
閱讀 3517·2019-08-30 15:56
閱讀 909·2019-08-30 15:55
閱讀 2934·2019-08-30 15:53
閱讀 1940·2019-08-29 17:11
閱讀 814·2019-08-29 16:52