摩卡不显示所有测试

时间:2013-08-15 22:54:08

标签: node.js unit-testing testing mocha


我在摩卡中进行了一些单元测试,当我运行时,只有2/3的测试显示出来。 我正在使用斑点记者,并通过make运行我的测试。

这是我的makefile:

REPORTER = list
TESTS = test/*.js test/**/*.js test/**/**/*.js
REQUIRE = should

test:
    @NODE_ENV=test NODE_PATH=./app/controllers ./node_modules/.bin/mocha \
    --reporter $(REPORTER) \
    --ui tdd \
    --require $(REQUIRE) \
    -G \
    $(TESTS)

test-ci:
    @NODE_ENV=ci NODE_PATH=./app/controllers ./node_modules/.bin/mocha \
    --reporter $(REPORTER) \
    --ui tdd \
    --require $(REQUIRE) \
    $(TESTS)

start:
    NODE_PATH=./app/controllers NODE_ENV=development nodemon server.js

.PHONY: test

test/test.js

/*!
 * Module dependencies.
 */

var request = require('supertest')
var app = require('../server')
var mongoose = require('mongoose')
var config = require('../config/config')[process.env.NODE_ENV];
// other stuff you want to include for tests


function clearDB(done) {
  (function(done) {
    var index = 0;
    var models = mongoose.modelNames();

    function deleteModel(err) {
      if (err) {
        return done(err)
      };
      if (index == models.length) {
        return done()
      };
      mongoose.model(models[index]).remove({}, deleteModel);
      index++;
    }
    deleteModel();
  })(done)
}

before(function(done) {
  this.timeout(0)
  clearDB(done);
})

function populateDatabase(Functions, done) {
  Func = mongoose.model("KIFunction");
  var functions = 0;

  if (typeof Functions == 'function') {
    done = Functions
    Functions = 20
  }

  function addFunction(err) {
    if (err) {
      done(err);
    }
    if (functions < Functions) {
      functions++;
      var func = new Func({
        string: ("n*" + functions),
        approved1: true,
        approved2: true,
        approved: true,
      }).save(addFunction);
    } else {
      done();
    }
  }
  addFunction();
}

describe('Functions', function() {
    describe('GET /functions/get', function() {
      it('Should be text/kinoki-function', function(done) {
        this.timeout(0)
        populateDatabase(11, function(err) {
          if (err) done(err)
          request(app)
            .get("/functions/get")
            .query('n=[]')
            .expect('Content-Type', new RegExp("kinoki-function"))
            .expect(200)
            .end(function(err, res) {
              if (err) return done(err)
              else done()
            })
        })
      })
      it('Should have 10 functions', function(done) {
        this.timeout(0)
        populateDatabase(25, function(err) {
          if (err) return done(err)
          request(app)
            .get("/functions/get")
            .query('n=[]')
            .expect(200)
            .end(function(err, res) {
              var body = res.text
              body.split("|").length.should.equal(10)
              if (err) return done(err)
              done()
            })
        })
        it('Each Of Them Should Match The Function Pattern', function(done) {
          this.timeout(0)
          populateDatabase(11, function(err) {
            if (err) return done(err)
            request(app)
              .get("/functions/get")
              .query('n=[]')
              .expect(200)
              .end(function(err, res) {
                var body = res.text
                body.split("|").forEach(function(func) {
                  func.should.match(/[0-9]#n([+\-*\/][0-9]+)+#(Easy|Medium|Hard|Deadly)+#[0-9a-fA-F]{24}/)
                })
                if (err) return done(err)
                done()
              })
          })
        })
        it('Should return \'false\' when there are no functions', function(done) {
          this.timeout(0)
          clearDB(function(err) {
            if (err) done(err)
            request(app)
              .get("/functions/get")
              .query('n=[]')
              .expect(200)
              .end(function(err, res) {
                if (err) return done(err)
                res.text.should.equal("false")
                done()
              })
          })
        })
        it('Should NOT throw an error when no array of functions to exclude is in the querystring', function(done) {
          this.timeout(0)
          clearDB(function(err) {
            if (err) done(err)
            request(app)
              .get("/functions/get")
              .end(function(err, res) {
                if (err) return done(err)
                res.status.should.not.equal(500)
                res.status.should.equal(200)
                done()
              })
          })
        })
      })

      describe("POST /functions/submit", function() {
        this.timeout(0)
        it("Should NOT be a 404", function(done) {
          request(app)
            .post("/functions/submit")
            .end(function(err, res) {
              if (err) return done(err)
              res.status.should.not.equal(404)
              done()
            })
        })
        it("Should be a 400 (Bad Request) without querystring", function(done) {
          request(app)
            .post("/functions/submit")
            .end(function(err, res) {
              if (err) return done(err)
              res.status.should.equal(400)
              done()
            })
        })
      })
    })
})


    after(function(done) {
      // do some stuff
      done()
    })

以下是mocha的输出:

  

03:48 PM Kinoki-Server Ari $ make test Express应用程序从端口9273开始

     

功能       GET / functions / get         ✓应该是text / kinoki-function(67ms)         ✓应该有10个功能(76ms)         POST / functions / submit           ✓不应该是404           ✓应该是没有查询字符串的400(错误请求)

     

4次传递(224 ms)

     

03:52 PM Kinoki-Server Ari $

它说4次传球,但我有6次测试!为什么摩卡会隐藏其他测试?

1 个答案:

答案 0 :(得分:3)

我的猜测是当你直接在it内嵌入调用时,mocha不能正确地注册它们。坚持每次拨打it的模式必须直接在describe回调中,看看是否能解决问题。