Jasmine Failure- TypeError:string不是函数

时间:2014-07-24 16:20:38

标签: angularjs jasmine angularjs-filter

我一直在尝试为一个小型JavaScript文件编写Jasmine测试。该文件为我的应用程序定义了一个名为“EIS”的事件。在我的Jasmine测试运行之前,我在Jasmine Specs Runner中收到一条失败消息,因为它无法正确读取我的过滤器。我按照这个问题中的简单说明进行操作:

How to unit test a filter in AngularJS 1.x

但它没有用,因为Jasmine甚至不会读取原始javascript文件中的过滤器。这是(带有eventModule.js的标题):

var app = angular.module("eisViewerApp",['ngGrid', 'ngRoute']);

function EISEvent(type, name, source, rawXML, $filter) {
    var date = new Date();
    **this.timestamp = $filter('date')(date, "yyyy-MM-dd HH:mm:ss a");**
    this.type = type;
    this.name = name;
    this.source= source;
    this.rawXML = rawXML;
    this.payload = "";

    this.setRawXml = function(rawXML) {
        this.rawXML = rawXML;
    }
    this.setPayload = function(payload) {
        this.payload = payload;
    }
}

这是Jasmine失败的描述:

TypeError: string is not a function
at new EISEvent (http://localhost:8080/EISViewer/js/eventModule.js:21:41)

我没有包含所有js代码,但第21行是围绕它的**。当应用程序控制器在另一个javascript文件中调用它时,我的过滤器工作。所以也许我需要在我的Jasmine测试中包含控制器和'EISEvent'函数调用?如果它有帮助,这是我的Jasmine测试:

describe( "EISEvent", function(){
   var eisEvent;
   var fakeDate = '10/23/2012';
   var fakeFilter;
   //inject the filter to resolve the dependency
       beforeEach(function() {
          inject(function ($injector) {
          //mock the services here
          fakeFilter = $injector.get('$filter')('date');
          })
       });
       beforeEach( function(){
           eisEvent = new EISEvent( "L", "theName", "theSource", "<beginTag>somexml</beginTag>", fakeFilter);
       });

    it( "Should be initialized", function(){
       expect( eisEvent ).toBeDefined();
    });
});

1 个答案:

答案 0 :(得分:0)

您的EISEvent期待Angular $filter服务的实例。但是在测试中,您传递的是实际日期过滤器功能(而不是$filter服务的实例)。

所以修改测试中的beforeEach()

beforeEach(function() {
    inject(function ($injector) {
    //mock the services here
    fakeFilter = $injector.get('$filter');
    })
});

要迂腐,它并不是真正的假冒过滤器&#34;因为你已经命名了这个变量。执行以下操作时,您需要检索实际的$filter服务:$injector.get('$filter');

当您将$filter服务传递到EISEvent课程时,测试中的代码应该与您的应用程序中的代码一样。

为了澄清EISEvent中的代码正在做什么,让我们分开。

原始代码:

this.timestamp = $filter('date')(date, "yyyy-MM-dd HH:mm:ss a");

在上文中,$filter('date')检索了Angular&#34; date&#34;过滤功能。然后(date, "yyyy-MM-dd HH:mm:ss a")执行传递date变量和日期格式字符串的过滤函数。