摩卡不会捕获未声明的变量

时间:2015-10-16 01:54:45

标签: javascript unit-testing mocha

我对使用mocha相当新,我遇到了这个bug。请帮助我理解这种行为。

'use strict';
 var flightMiddlewareMock = require(process.cwd() + '/test/mock/response/flightmock');


describe('Test Flights function: getTime', function(){
  var mockData;
  beforeEach(function(done){
    mockData = flightMiddlewareMock.getValidData();
    done();
  }
  it('getFlightDescription returns the full flight description', function(done){

    contentUtils.loadContent({
            'files': {
                activity: '/flights/america'
            },
            'locality': "en_US"
    }, function(err, bundle) {

            var flightsMiddleware = new FlightsMiddleware(country, mockData.req, bundle); 
            console.log('inside content callback');

            description = flightsMiddleware.getFlightDescription(mockData.results.body.items[0]);

            assert.equal(description, "Boeing 777");
            done();
    }
  });
});

输出看起来像这样

inside content callback
inside content callback
inside content callback

- 测试失败!

问题 - 我不明白为什么尽管使用'use strict'它并没有抱怨没有声明的描述。

请注意:如果我将其修改为

var description = .....

它起作用中提琴!我错过了什么吗? 谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

Mocha将报告因尝试分配给未声明的变量而导致的异常。如果我运行这个:

"use strict";

it("foo", function (done) {
    setTimeout(function () {
        description = "foo";
        done();
    }, 1000);
});

我得到了结果:

  1) foo

  0 passing (1s)
  1 failing

  1)  foo:
     Uncaught ReferenceError: description is not defined
      at null._onTimeout (test.js:5:21)

现在,我已经使用setTimeout这是一个表现良好的函数,因为当传递给它的回调引发异常时,setTimeout不会阻止此异常到达顶部执行上下文。换句话说,它不会吞下异常。

如果你有一个抛出异常的回调但这个异常被调用回调的代码吞没了,你会得到测试超时但是你不知道为什么因为摩卡不能检测到异常。它依赖于uncaughtException event,如果吞下异常则不会发出。{/ p>