摘要:介绍使用,就可以测试指定的案例加入可以进行测试异步模块的案例安装全局配置命令行配置加载框架引入。
介绍
安装使用 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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 3809·2023-04-26 00:05
阅读 1384·2021-11-11 16:55
阅读 4060·2021-09-26 09:46
阅读 3805·2019-08-30 15:56
阅读 1118·2019-08-30 15:55
阅读 3133·2019-08-30 15:53
阅读 2197·2019-08-29 17:11
阅读 1017·2019-08-29 16:52