2013-03-31 28 views
1

我有一个Angular JS应用程序,其中包含一个模块和一些服务。我的控制器使用这些服务。在Jasmine测试用例中,我使用Jasmine的createSpy创建了一个服务模拟。以下是模拟服务:茉莉花的间谍投掷不是功能错误

beforeEach(module(function ($provide) { 
    shoppingData = function() { 
     getAllItems: jasmine.createSpy('getAllItems'); 
     addAnItem: jasmine.createSpy('addAnItem'); 
     removeItem: jasmine.createSpy('removeItem'); 
    }; 
    $provide.value('shoppingData', shoppingData); 
})); 

控制器在创建对象后立即调用getAllItems函数。我创建了另一个创建控制器对象的beforeEach块。以下是试块,以检查是否getAllItems被称为:

it("Should call getAllItems function on creation of controller", function() { 
    expect(shoppingData.getAllItems).toHaveBeenCalled(); 
}); 

当我运行在浏览器中亚军规范网页,测试失败,以下错误:类型错误:“shoppingData.getAllItems”是不是一个函数

我看到了几个类似的例子,这种测试没有任何问题。任何人都可以指出什么是缺失或什么是错误的?

更新:我创建了一个plunker with the part that fails

回答

2

似乎是一个错字,如果这是真正的代码。在拨付部分更改为:

shoppingData = { 
    getAllItems: jasmine.createSpy('getAllItems'), 
    addAnItem: jasmine.createSpy('addAnItem'), 
    removeItem: jasmine.createSpy('removeItem') 
}; 

只是改变了功能,对象,改变了;,

更新1:

只考虑在从事间谍活动的现有对象:

var deferred, _shoppingData; 

beforeEach(module('shopping')); 

beforeEach(inject(function(shoppingData, $q) { 
    _shoppingData = shoppingData; 
    deferred = $q.defer(); 
    spyOn(shoppingData, 'getAllItems').andReturn(deferred.promise); 
})); 

it('should have called shoppingData.getAllItems', function() { 
    expect(_shoppingData.getAllItems).toHaveBeenCalled(); 
}); 
+0

我试过这个方法了。但它会抛出一个错误:'无法将shoppingData.getAllItems'转换为对象 –

+0

也许您正在做其他事情。我做了一个[在这里工作的Plnker](http://plnkr.co/edit/Fj66l17cVtMe3XoxK8CS?p=preview)。看它。如果你什么都不懂,请告诉我,我会尽力解释。也许你忘了创建控制器,或者注入一些东西。只有当你第一次注入东西的时候,模块才会被创建,并且shoppingData可以被使用。 –

+0

感谢您的努力。调整好你的plunker并分析我的代码后,我知道它失败了,因为我调用getAllItems的函数使用返回的对象来调用then()函数。我分叉你的plnk并创建了一个演示。你可以从这里访问它:http://plnkr.co/edit/BenU8lJtICS2uNyrtjns?p=preview –

0

你为什么不尝试:

var scope, myController; 

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    myController = $controller.('controllerName', { 
    $scope: scope, 
    shoppingData: jasmine.createSpyObj('shoppingData', ['getAllItems', 'addAnItem', 'removeItem']) 
    }); 
}));