写入单元测试角度控制器

时间:2014-05-29 16:38:42

标签: angularjs

我的控制器看起来像这样

angular.module('demo').controller('demoCtrl',['$scope','$modal', function($scope, $modal){

  $scope.askForInput = function(action){

       var modalInstance = $modal.open({
         /* here i open a modal and display a form to get some input */
       });

      modalInstance.result.then(function(input){
      /* process the input here */   
  });

  };  

}

我感到困惑的部分是如何测试这段代码,即测试模式是否已打开,表格是否已填充且数据是否已在此控制器中收到?

我正在使用茉莉花,并且我自己被困在第一行。

1 个答案:

答案 0 :(得分:0)

我不建议您测试$modal,而是推荐demoCtrl,特别是askForInput做它应该做的事情。当您在测试中创建控制器时,可以为$scope$modal注入模拟值。因为您正在注射模拟,所以您可以完全控制它们的行为方式。

例如,您可以执行以下操作:

// dependencies
var $scope, $modal, controller;

// test values
var modalOpenInput, modalInstance;

beforeEach(module("demo"));

beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();

    modalInstance = {
        result: {
            then: function(callback) {
                // define what to do here...
            }
        }
    };

    $modal = {
        open: function(input) {
            // by storing this you're able to later
            // confirm it's value was set
            modalOpenInput = input;
            return modalInstance;
        }
    };

    controller = $controller("demoCtrl", {
        $scope: $scope,
        $modal: $modal
    });
}));

it("should do what it's supposed to do...", function() {
    $scope.askForInput();

    // test the function works as defined...
    expect(modalOpenInput).toBeDefined();
    // etc...
});

希望这可以让您了解如何向前发展。您甚至可以根据输入定义多个路径,并验证每个路径是否按定义工作。由于您可以访问模拟,因此您可以定义$modal及其所有功能的行为。