javascript - 在单元事件测试 karma 中传递参数

标签 javascript angularjs unit-testing karma-jasmine watch

测试这样的函数:

beforeEach(inject(function($rootScope, $controller, $injector){
    service = $injector.get('service');
    scope = $rootScope.$new();
    createController = function() {
        return $controller('mainCtrl', {
            '$scope': scope
        });
    };
}));

$scope.$watch('value', function(newVal, oldVal) {
    if(newVal != oldVal)
      service.setValue(newVal);  
});

通过这样的测试:

it("$watch value",function(){
        spyOn(service,'setValue').andCallThrough();
        var controller=createController();
        scope.value = true;
        expect(service.setValue).toHaveBeenCalled();
}) 

并且 spy 永远不会因为这种情况而被触发。 如何使用参数触发此监视事件以测试服务是否被调用?

最佳答案

请进行以下更改:

您需要使用scope.$apply();更新绑定(bind)和contoller as语法以获取controller.value

在定义 Controller 时使用this而不是scope,这样变量就可以在Jasmine中轻松使用。

Jasmine 脚本:

describe("test", function() {

    var Service, scope, controller;

    beforeEach(module('inspinia'));
    beforeEach(inject(function($rootScope, $controller, $injector, serviceData) {
        Service = serviceData;

        scope = $rootScope.$new();
        controller = $controller('mainCtrl as ctrl', {
            $scope: scope
        });;

    }));

    it("$watch value", function() {

          spyOn(Service,'setValue').and.callThrough();
          controller.value = 1120;
          scope.$apply();
          controller.value = 1121;
          scope.$apply();         
         expect(Service.setValue).toHaveBeenCalled();
    })
})

Angular 脚本:

(function() {
    'use strict';
    angular.module('inspinia', [])
        .controller('mainCtrl', function($scope, serviceData) {

            var ctrl = this;
            ctrl.value = 1230;
            $scope.$watch('ctrl.value', function(newVal, oldVal) {


                if (newVal != oldVal) {
                    console.log(newVal, oldVal, newVal !== oldVal);
                    serviceData.setValue(newVal);
                }
            });

        })
        .factory('serviceData', function() {

            var obj = {};

            obj.setValue = function() {

                console.log(1010)

            }
            return obj;
        });
})();

关于javascript - 在单元事件测试 karma 中传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35152389/

相关文章:

javascript - Ionic 将 firebase 注入(inject)工厂,同时将 Controller 和服务保存在不同的文件中

javascript - 使用geoxml3显示多边形kml文件

javascript - HTML - 来自一个 div 的子元素覆盖另一个 div

AngularJS - 动态更改过滤器上的货币符号?

c# - 我如何从下面的代码中编写 TDD 代码?

xml - 生成 Google C++ 单元测试 XML 报告

python - 在 pycharm/pydev 中调试 pytest 事后异常

javascript - 始终在 webkit 浏览器中显示水平滚动条(特别是 Safari 和 iOS 设备)

javascript - JavaScript 中的双三元

javascript - 为什么将 AngularJS 指令限制为类是不好的?