1


我在 mocha 中有一些单元测试,当我运行这些时,只有 2/3 的测试出现。我正在使用斑点报告器,并通过 make 运行我的测试。

这是我的生成文件:

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$ 在端口 9273 上启动测试 Express 应用程序

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

4 次通过(224 毫秒)

03:52 PM Kinoki-Server Ari$

它说 4 次通过,但我有 6 次测试!为什么 mocha 隐藏其他测试?

4

1 回答 1

4

我的猜测是,当您直接将调用嵌套it在彼此内部时,mocha 不会正确注册它们。坚持每次调用都it必须直接在describe回调中的模式,看看是否可以解决它。

于 2013-08-15T23:27:18.387 回答