我一直在尝试为一个小型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();
});
});
答案 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
变量和日期格式字符串的过滤函数。