【问题标题】:how to test service property call如何测试服务属性调用
【发布时间】:2015-08-29 11:52:27
【问题描述】:

这是我的 temp.js

angular.module('temp', [])
    .service('tempFactory', function() {
        this.a = 10;
    })
    .controller('tempCtrl', function($scope, tempFactory) {
        $scope.a = tempFactory.a;
    });

这是我的 temp.Spec.js

describe('temp', function() {
    var ctrl, scope;

    beforeEach(function() {
        module('temp');

        inject(function($rootScope, $controller) {
            scope = $rootScope.new();
            ctrl = $controller('tempCtrl', {$scope: scope});
        });
    });
});

我知道要测试服务方法调用,必须使用 spy。但是如何测试服务属性调用(在我的代码中是 $scope.a = tempFactory.a;)?我怎样才能知道 是否调用了任何服务的某些属性?

【问题讨论】:

    标签: angularjs unit-testing jasmine karma-runner sinon


    【解决方案1】:

    编写一个测试范围值的规范。不需要间谍。写一些大意的东西:

    it('sets a to the expected value from the service', function () {
      expect(scope.a).toBe(10);
    });
    

    【讨论】:

    • 好的,如果不需要间谍,请告诉我人们使用间谍做什么?我知道间谍做什么,我的意思是另一个。想象一下我有这样的代码: nameService = { getName: function() {return 'Pasha';} }; $scope.test = function() { $scope.name = nameService.getName(); };
    • 我需要测试 $scope.test 方法。如果你说不需要间谍,那么我只需要在调用 $scope.test() 之后进行测试,$scope.name 的值是否为“Pasha”?但是在许多文章和示例中,我看到人们不仅测试了将设置为范围属性的值,他们还测试了 nameService.getName 是使用间谍调用的。如果你说不需要间谍,那么人们测试方法需要什么?为什么他们不只测试将设置为范围属性的值?
    • 我建议这里不需要间谍的原因是因为您询问了测试是否设置了 a 属性。您不能将间谍用于属性。如果您想测试 Controller、Directive 或 Service 的方法是否按预期运行,则应使用特定参数调用该方法并测试状态是否更改为符合您的预期。
    • 如果您正在寻找如何使用间谍;当您要验证是否在当前未测试的对象上调用了方法时,通常会使用它们。因此,例如,如果您想测试您的对象在调用特定方法时是否调度了一个事件,那么最好的方法是在作用域上侦听该事件并将其传递给一个 spy,这样您就会知道它有被调用。
    • 我通常使用 spy 来检测我的“被测代码”何时对当前未“被测”的对象调用方法。换句话说,要模拟出我目前没有测试的对象,但需要测试代码才能工作......也就是依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多