码迷,mamicode.com
首页 > 其他好文 > 详细

mocha

时间:2015-10-11 00:28:42      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

教程:https://cnodejs.org/topic/516526766d38277306c7d277

 

看着挺爽的。

 

//同步

var assert = require(‘assert‘);

describe(‘Array‘, function(){
	describe(‘#indexOf‘, function(){
		it(‘should return -1 when the value is not present‘, function(){
			assert.equal(-1, [1,2,3].indexOf(5));
			assert.equal(-1, [1,2,3].indexOf(0));

		})
	})
})

describe (moduleName, testDetails)
由上述代码可看出,describe是可以嵌套的,比如上述代码嵌套的两个describe就可以理解成测试人员希望测试Array模块下的#indexOf() 子模块。

module_name 是可以随便取的,关键是要让人读明白就好。

it (info, function)
具体的测试语句会放在it的回调函数里,一般来说info字符串会写期望的正确输出的简要一句话文字说明。

当该it block内的test failed的时候控制台就会把详细信息打印出来。

一般是从最外层的describe的module_name开始输出(可以理解成沿着路径或者递归链或者回调链),最后输出info,表示该期望的info内容没有被满足。

一个it对应一个实际的test case

assert.equal (exp1, exp2)
断言判断exp1结果是否等于exp2, 这里采取的等于判断是== 而并非 === 。即 assert.equal(1, ‘1’) 认为是True。

这只是nodejs里的assert.js的一种断言形式,下文会提到同样比较常用的should.js。

采用should

 

//异步

最深处的回调函数中加done()表示结束:按照瀑布流编程习惯,取名done是表示你回调的最深处,也就是结束写嵌套回调函数。但对于回调链来说done实际上意味着告诉mocha从此处开始测试,一层层回调回去。

假如我有两个异步函数(两条分叉的回调链),那我应该在哪里加done()呢?实际上这个时候就不应该在一个it里面存在两个要测试的函数,事实上一个it里面只能调用一次done,当你调用多次done的话mocha会抛出错误。

fs = require(‘fs‘);
describe(‘File‘, function(){
    describe(‘#readFile()‘, function(){
        it(‘should read test.ls without error‘, function(done){
            fs.readFile(‘test.ls‘, function(err){
                if (err) throw err;
                done();
            });
        })
        it(‘should read test.js without error‘, function(done){
            fs.readFile(‘test.js‘, function(err){
                if (err) throw err;
                done();
            });
        })
    })
})

 

未写细节的:默认会pass

describe(‘Array‘, function(){
    describe(‘#indexOf()‘, function(){
        it(‘should return -1 when the value is not present‘, function(){
        })
    })
});

 

only skip函数:只有only的会被执行,另一个会被忽略掉。每个函数里只能有一个only。如果是it.skip ,那么该case就会被忽略。

fs = require(‘fs‘);
describe(‘File‘, function(){
    describe(‘#readFile()‘, function(){
        it.only[skip](‘should read test.ls without error‘, function(done){
            fs.readFile(‘test.ls‘, function(err){
                if (err) throw err;
                done();
            });
        })
        it(‘should read test.js without error‘, function(done){
        })
    })
})

 

before beforeEach after afterEach

beforeEach会对当前describe下的所有子case生效。
before和after的代码没有特殊顺序要求。
同一个describe下可以有多个before,执行顺序与代码顺序相同。
同一个describe下的执行顺序为before, beforeEach, afterEach, after
当一个it有多个before的时候,执行顺序从最外围的describe的before开始,其余同理。

 

以上都是BDD 行为驱动开发

如果是TDD的话 测试驱动开发:suite, test, setup, teardown

suite ‘Array‘, !->
    setup !->
        console.log ‘setup‘

    teardown !->
        console.log ‘teardown‘

    suite ‘#indexOf()‘, !->
        test ‘should return -1 when not present‘, !->
            assert.equal -1, [1,2,3].indexOf 4

 

mocha

标签:

原文地址:http://www.cnblogs.com/wang-jing/p/4868662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!