茉莉花的间谍投掷不是一个功能错误

时间:2013-03-31 18:25:12

标签: javascript unit-testing angularjs jasmine

我有一个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();
});

当我在浏览器上运行spec runner页面时,测试失败并出现以下错误:TypeError:'shoppingData.getAllItems'不是函数

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

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

2 个答案:

答案 0 :(得分:3)

如果这是真正的代码,似乎是一个错字。将适当的部分更改为:

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

刚刚将功能更改为对象,并更改了;的{​​{1}}。

更新1:

仅考虑对现有对象进行间谍活动:

,

答案 1 :(得分:0)

你为什么不试试:

var scope, myController;

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