Javascript 茉莉花&x27;s spy抛出不是函数错误

Javascript 茉莉花&x27;s spy抛出不是函数错误,javascript,unit-testing,angularjs,jasmine,Javascript,Unit Testing,Angularjs,Jasmine,我有一个Angular JS应用程序,其中包含一个模块和一些服务。我的控制器使用这些服务。在Jasmine测试用例中,我使用Jasmine的createSpy创建了一个模拟服务。以下是模拟服务: beforeEach(module(function ($provide) { shoppingData = function () { getAllItems: jasmine.createSpy('getAllItems'); addAnItem: jasmi

我有一个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
函数。我在创建控制器对象的每个块之前创建了另一个
。以下是检查是否调用了
getAllItems
的测试块:

it("Should call getAllItems function on creation of controller", function () {
    expect(shoppingData.getAllItems).toHaveBeenCalled();
});
当我在浏览器上运行spec runner页面时,测试失败,出现以下错误:TypeError:“shoppingData.getAllItems”不是函数

我看到了几个类似的例子,其中这种测试没有任何问题。有人能指出这里遗漏了什么或出了什么问题吗


更新:如果这是真正的代码,我创建了一个

看起来像是打字错误。将适当的部分更改为:

shoppingData={
getAllItems:jasmine.createSpy('getAllItems'),
addAnItem:jasmine.createSpy('addAnItem'),
removietem:jasmine.createSpy('removietem'))
};
只是将函数更改为对象并更改了
用于

更新1:

考虑仅监视现有对象:

var延迟,\u shoppingData;
每次上课前(模块(“购物”);
beforeach(注入函数(shoppingData,$q){
_shoppingData=shoppingData;
递延=$q.defer();
spyOn(shoppingData,'getAllItems').andReturn(deferred.promise);
}));
它('应该调用shoppingData.getAllItems',函数(){
期望(_shoppingData.getAllItems).tohavebeincalled();
});
为什么不试试:

var scope, myController;

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

我也尝试过这种方法。但它会抛出一个错误,即:“无法将shoppingData.getAllItems”转换为对象,可能是您在做其他错误的事情。我发了一封信。看看它。如果你什么都听不懂,请告诉我,我会尽力解释的。也许你忘了创建控制器,或者注入了一些东西。只有当你第一次注入一些东西时,模块才会被创建,shoppingData才会可用。谢谢你的努力。在稍微调整了一下plunker并分析了我的代码之后,我知道它失败了,因为我在其中调用getAllItems的函数使用返回的对象来调用then()函数。我为你的plnkr做了一个演示。您可以从这里访问它:然后您所要做的就是用
andReturn
模拟返回值,看看。在创建
shoppingData
对象之后添加此行:
shoppingData.getAllItems.andReturn({then:function(){}})。但是,从这个新的角度来看,您不需要模拟整个对象,只需在每次之前在
中注入并
spyOn
它。更新了你的。也考虑阅读。谢谢Caio。我知道大约$httpBackend。我将逻辑放在一个单独的服务中,以使控制器不受数据访问逻辑的影响。我没有检查Jasmine的文件。我会挺过去的。