zoukankan      html  css  js  c++  java
  • Mocha 从0开始

    Mocha

    Mocha 是具有丰富特性的 JavaScript 测试框架,可以运行在 Node.js 和浏览器中,使得异步测试更简单更有趣。Mocha 可以持续运行测试,支持灵活又准确的报告,当映射到未捕获异常时转到正确的测试示例。

    Sinon 是一个独立的 JavaScript 测试spy, stub, mock库,没有依赖任何单元测试框架工程。

    assert模块

    搬运自
    http://javascript.ruanyifeng.com/nodejs/assert.html#toc2

    
    var assert = require('assert');
    //assert方法接受两个参数,当第一个参数对应的布尔值为true时,不会有任何提示,返回undefined。当第一个参数对应的布尔值为false时,会抛出一个错误,该错误的提示信息就是第二个参数设定的字符串。
    assert.equal(Math.max(1,100),100, '预期相等');
    
    
    // 以下三句效果相同
    assert(Math.max(1,100) == 100, '预期等于100');
    assert.ok(Math.max(1,100) == 100, '预期等于100');
    assert.equal(Math.max(1,100), 100, '预期等于100');
    
    
    //预期代码会抛出一个错误
    //如果没有抛出错误反而认为是有问题的
    assert.throws(
      function() {
        if(add(1,2) == 3){
          throw new Error('add result wrong');
        }
      },
      /add/,
      'add有问题'
    );
    
    

    mocha 第一步

    mocha需要全局安装 一会儿我们需要用到mocha命令
    之后可以通过mocha xxx.js 来执行测试

    或者把待测试js都放在test文件夹中
    之后在和test的同级目录运行mocha命令(推荐)

    一个简单的mocha例子

    var assert = require("assert");
    
    //测试Array中的indexOf
    
    
    describe('Array', function() {
      describe('#indexOf()', function() {
        //具体的测试语句会放在it的回调函数里
        //
        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可以嵌套 module_name 是可以随便取的

    it (info, function)
    具体的测试语句会放在it的回调函数里,一般来说info字符串会写期望的正确输出的简要一句话文字说明
    当该it block内的test failed的时候控制台就会把详细信息打印出来

    异步测试

    参考
    https://lostechies.com/derickbailey/2012/08/17/asynchronous-unit-tests-with-mocha-promises-and-winjs/
    异步的测试有什么不同呢? 如果你在测试异步的代码 你并不知道异步的代码什么时候完成

    你天真的会以为是这样 (这里使用的Chai来作断言)

    describe("a test", function(){
      var foo = false;
      beforeEach(function(){
        setTimeout(function(){
          foo = true;
        }, 50);
      });
    
      it("should pass", function(){
        expect(foo).equals(true);
      });
    
    });
    

    实际上应该这样

    describe("a test", function(){
      var foo = false;
      beforeEach(function(done){
        setTimeout(function(){
          foo = true;
          done();
        }, 500);
      });
      it("should pass", function(){
        expect(foo).equals(true);
      });
    });
    

    使用Promise的异步

    describe("a test", function(){
      var foo = false;
      beforeEach(function(done){
        var promise = new Promise(function(resolve){
          resolve(true);
        });
        promise.then(function(value){
          // get the value from the completed promise
          foo = value;
          // complete the async beforeEach
          done();
        });
      });
      it("should pass", function(){
        expect(foo).equals(true);
      });
    });
    
    

    Mocha的Assertions

    Mocha官网上关于mocha可用的assertion列举了很多断言库

    • should.js BDD风格
      API
    var should = require('should');
    should('abc').be.a.String();
    
    var a = { a: 10 }, b = Object.create(null);
    b.a = 10;
    
    a.should.be.eql(b);
    
    • expect.js based on should.js
    expect(window.r).to.be(undefined);
    expect({ a: 'b' }).to.eql({ a: 'b' })
    expect(5).to.be.a('number');
    expect([]).to.be.an('array');
    expect(window).not.to.be.an(Image);
    

    demos

    • Chai
      Chai 是一个针对 Node.js 和浏览器的行为驱动测试和测试驱动测试的断言库,可与任何 JavaScript 测试框架集成。
      它拥有 should expect assert 三种模式
      访问Official Site即可看到

    比如expect

    var expect = chai.expect;
    
    expect(foo).to.be.a('string');
    expect(foo).to.equal('bar');
    expect(foo).to.have.length(3);
    expect(tea).to.have.property('flavors').with.length(3);
    
    • better-assert
      assert('tobi' == user.name);
      assert('number' == typeof user.age);
    
  • 相关阅读:
    【洛谷 1546】最短网络
    [Algorithms]Greedy
    [Operating System]Thread Pool
    微积分——外微分形式的微积分
    Codeforce Round #548(Div2)
    Codeforce Round #544(Div3)
    Codeforce Round #545(Div2) (BCD题解)
    桶排序桶的前缀和/差分
    Codeforce Round #545(Div2)
    Codeforce Round #531(Div3)
  • 原文地址:https://www.cnblogs.com/cart55free99/p/4946303.html
Copyright © 2011-2022 走看看