我是开发为什么要写单元测试呢
- 逼格高啊,没有单元测试的代码在github上是会被鄙视的
- 可以通过测试用例更快更好的理解代码
- 祖传代码 不敢改,改了这个功能,那个就不好使了
举个栗子:张老师接到一个任务,做了几个功能后交给了宋同学,宋同学不知道有这几个方法,继续完成新的功能,可能把以前张老师已经完成的改的很乱,到上线才发现原来的功能没有了,这个锅怎么背 哈哈
mocha测试环境
mocha是一个可以在node和浏览器环境运行的测试框架
mocha官网
安装mocha
npm install mocha -g
测试需要断言函数,mocha自己是没有的,需要用一些断言函数
比较常用的有assert,shouldjs,chai
简单的测试用例
语法 assert.equal(actual,expected)
actual(实际值), expected( 期望值) 相当于==
如果actual和expected相等的话,测试通过
assert.equal(actual,expected)
var assert = require('assert')
describe('Array', function () {
describe('#indexOf()', function () {
it('should return -1 when the value is not present', function () {
assert.equal([1, 2, 3].indexOf(4), -1)
})
})
})
语法 assert.deepEqual(actual,expected)
判断对象内容是否相等
describe('assert', function() {
it('a和b应当深度相等', function() {
var a = {
c: {
e: 1
}
};
var b = {
c: {
e: 1
}
};
assert.deepEqual(a, b);
});
});
判断对象的属性
const user = {
name: 'jsong',
eat: () => 'apple',
speak: () => 'say hello',
net: function () {
}
}
describe('User', function() {
describe('users', function() {
it('user name should == jsong ', function() {
// user 应该的 name 属性 应该==jsong
assert.equal(user.name, 'jsong');
});
it('user should eat apple', function() {
// user 的 eat() 方法 应该返回 apple
assert.equal(user.eat(), 'apple');
});
it('user should have name', function() {
// user 应该有name 属性
user.should.have.property('name');
});
});
});
异步测试
也很简单,只需要在回掉函数中在一个参数就可以了,一般命名为done。mocha自己就知道需要等这个这个函数被调用才完成测试
function UserObj(name) {
this.name = name
}
UserObj.prototype.save = function () {
http.get({
hostname: 'localhost',
port: 80,
path: '/'
}, res => console.log(111))
}
describe('asynchronous', function () {
describe(' save userObj ', function () {
it('should save without error ', function (done) {
const user = new UserObj('jsong')
user.save(function (err) {
if (err) done(err);
else done();
})
// done()
// user.save(done)
})
})
})
钩子函数
mocha提供了before(),beforeEach(),after(),afterEach() 帮助我们设置前提条件,和测试后的清理。
describe('hooks', function () {
it('my test', () => {
// this.timeoute(1000)
assert.ok(true)
})
before(function () {
console.log('before')
})
after(function () {
console.log('after')
})
beforeEach(function () {
console.log('beforeEach')
})
after(function () {
console.log('after')
})
afterEach(function () {
console.log('after')
})
})