【问题标题】:Function not found in Mocha\Karma Test在 Mocha\Karma 测试中找不到函数
【发布时间】:2016-01-12 20:22:43
【问题描述】:

我在文件 A 中定义了一个简单的类,如下所示:

var canSendTestEmail = (function(){
    'use strict';
    return{
        sendTestEmail: _sendTestEmail()
    }

    function _sendTestEmail(){
        //do something
        return null;
    }
})

文件 A 位于同一文件夹中,并且正在通过 Karma config 正确加载

我在一个非常简单的 Mocha 测试中使用这个类。测试如下:

 describe('canSendTestEmail', function(){
    'use strict';
    describe('should send an email', function(){
        expect(canSendTestEmail.sendTestEmail()).to.equal(null);
    });
});

我正在使用 Karma 作为测试运行器来测试 Angular 应用程序。 Chai、Sinon 和所有常见的嫌疑人都已正确加载。

运行测试时,我收到以下错误:

TypeError: 'undefined' is not a function (evaluating 'canSendTestEmail.sendTestEmail()')

我已经尝试了各种方法来定义类 canSendTestEmail 并且无论我得到什么类型都找不到或者上面的错误。

我想我在这里遗漏了一些明显的东西。我来自 C++ 和 Java 背景,所以这可能是一个 javascript“东西”

怎么了?

我的问题已经得到解答!我稍后会发布我的更新代码。

【问题讨论】:

  • 我忘了补充一点,我知道文件 A 正在正确加载到 Karma 中
  • canSendTestEmail.sendTestEmail 未定义,您正在尝试将其作为函数运行...
  • 把我的代码改成了这个,现在得到一个错误,说 canSendTestEmail 找不到。 (function(){ 'use strict'; function canSendTestEmail (){ } canSendTestEmail.prototype.sendTestEmail = function(){return null;} })()
  • canSendTestEmail 是一个函数,一个未解析的函数,这是,您定义了它,但没有运行它(认为是指向 C++ 函数的指针)。然后您尝试获取它的属性,这在 javascript 中非常好......因为这是有效的:(function () {}).sendTestEmail,其中返回undefined。然后你尝试执行 undefined,然后你得到你的错误。
  • 我想我正在为为什么它没有得到解决而苦苦挣扎,因为我在过去几个月中多次用 Javascript 编写过这样的代码并且从未见过这种情况。您将如何实现该功能?

标签: angularjs mocha.js karma-runner


【解决方案1】:

类定义有两个问题。

工作版本是这样的:

var canSendTestEmail = (function(){
    'use strict';
    return{
        sendTestEmail: _sendTestEmail  // (problem 2) notice no parenthesis here
    }

    function _sendTestEmail(){
        //do something
        return null;
    }
})()  // (problem 1) notice parenthesis here

首先,正如问题的 cmets 所述,canSendTestEmail 是一个返回对象的函数。

所以canSendTestEmail.sendTestEmail() 语句尝试调用函数的sendTestEmail() 方法,而不是该函数创建的对象的方法。

这其实和做这样的事情是一样的(可以在浏览器javascript控制台中测试):

var func = function (){}
func.sendTestEmail()

VM510:2 Uncaught TypeError: func.sendTestEmail is not a function(…)

第二个问题,函数_sendTestEmail实际上是在对象定义中被调用的,所以我们会得到一个像{sendTestEmail: null}这样的对象——sendTestEmail是null而不是函数。

【讨论】:

  • 不确定如何将此标记为已回答。我得到了上述解决方案,@joaumg 朝正确的方向点头。
  • @JasonGuarracino 那么也许最好让 joaumg 添加他的评论作为回复,你可以接受它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
相关资源
最近更新 更多