javascript - 如何在 karma + jasmine 中测试我的 Angular 作用域函数?

标签 javascript angularjs json jasmine karma-jasmine

我对 Angular 相当陌生,对 Jasmine 测试也很陌生。我的 Controller 中有一个函数,用于将对象插入空数组(从 json 数据获取的对象)。

我的 Controller 具有与购物车相关的功能:

$scope.cart = [];

  $scope.addItemToCart = function(choc) {
    var cartItem = readCartItem(choc.id);
    if(cartItem == null) {
      //if item doesn't exist, add to cart array
      $scope.cart.push({type: choc.type, id: choc.id, price: choc.price, quantity: 1})
    } else {
      //increase quantity
      cartItem.quantity++;
    }
  }

  $scope.cartTotal = function() {
    var sum = 0;
    $scope.cart.forEach(function(item) {
      sum += item.price * item.quantity;
    });
    return sum;
  }

  $scope.getTotalQuantity = function() {
    var totalItems = 0;
    $scope.cart.forEach(function(item) {
      totalItems += item.quantity;
    });
    return totalItems;
  }

  $scope.clearCart = function() {
    $scope.cart.length = 0;
  }

  $scope.removeItem = function(choc) {
    $scope.cart.splice(choc,1);
  }

  function readCartItem(id) {
    //iterate thru cart and read ID
    for(var i=0; i<$scope.cart.length; i++) {
      if($scope.cart[i].id === id) {
        return $scope.cart[i]
      }
    }
    return null;
  }

我的测试:

  describe('Controller: ChocoListCtrl', function () {

  beforeEach(module('App'));

  var scope, ctrl, json;

  beforeEach(inject(function ($controller, $rootScope) {


    scope = $rootScope.$new();
    // ChocoListCtrl = $controller('ChocoListCtrl', {});
    ctrl = $controller("ChocoListCtrl", { $scope:scope })
  }));

  it('should be defined', function (){
    expect(ctrl).toBeDefined();
  });

  it('should have an empty cart', function(){
    expect(scope.cart.length).toBeLessThan(1);
  });

  describe('cart functions', function(){
    beforeEach(function(){
      scope.addItemToCart();
    })

    it('should add objects into the cart', function(){
      expect(scope.cart.length).toBeGreaterThan(0);
    })
  });

运行测试时出现的错误:

TypeError: undefined is not an object (evaluating 'choc.id')

我以为我正在将一个对象插入数组?我错过了什么吗?如果有帮助的话我应该包含 JSON 文件吗?

任何指导都会有所帮助。谢谢!

最佳答案

您没有将参数传递给 $scope.addItemToCart。因此,当它尝试读取 choc 时,它无法读取,因为它是未定义

此行导致错误:

beforeEach(function(){
  scope.addItemToCart(); // No parameter being passed in
})

关于javascript - 如何在 karma + jasmine 中测试我的 Angular 作用域函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41924841/

相关文章:

javascript - Dojo 获取元素类型

angularjs - 错误状态代码未被捕获

angularjs - 无法在 Node.js res.body 中获取 $http.post 请求数据

c# - 为什么我的 json 反序列化失败?

javascript - 按 id 下拉多个 div

javascript - 当前元素上的 clearInterval

javascript - 将 $(this) 传递到设置的超时函数中?

javascript - 如何实现 Angular 数据表中的动态列隐藏?

javascript - 使用 JSON Api URL EmberJS

Python - 如何在字典的顶部插入一个元素?