javascript - 如何测试我的服务是否使用 jasmine 和 angularjs 返回数据

标签 javascript angularjs jasmine chutzpah

我已经开始使用 jasmine 在 angularjs 中测试我的 Controller ,但是在阅读了一些教程后,我有点卡住了。

我有一个简单的 angularjs Controller ,名为 jasmineController

(function () {
    "use strict";

    var myAppModule = angular.module('myApp');

    myAppModule.controller('jasmineController', ['$scope', 'genericService',
        function ($scope, genericService) {
            $scope.name = 'Superhero';
            $scope.counter = 0;
            $scope.$watch('name', function (newValue, oldValue) {
                $scope.counter = $scope.counter + 1;
            });

            $scope.testPromise = function() {
                return genericService.getAll("dashboard", "currentnews", null, null, null);
            }

            $scope.getNewsItems = function () {
                genericService.getAll("dashboard", "currentnews", null, null, null).then(function (data) {

                    $scope.name = 'Superhero';
                    $scope.newsItems = data;

                });
            }

        }
    ]);
})();

在我的 Jasmine 测试中,我想调用 getNewsItems 并检查它是否可以调用 genericService.getAll 以及 $scope.newsItems 是否分配了一些数据。我知道我会 mock 该服务,但实际上不会调用它。

这是我的规范

describe("test", function () {
    // Declare some variables required for my test
    var controller, scope, genericService;

    // load in module
    beforeEach(module("myApp"));


    beforeEach(inject(function ($rootScope, $controller, _genericService_) {
        genericService = _genericService_;
        // assign new scope to variable
        scope = $rootScope.$new();
        controller = $controller('jasmineController', {
            '$scope': scope
        });
    }));
    it('sets the name', function () {
        expect(scope.name).toBe('Superhero');
    });

    it('should assign data to scope', function() {
        //var fakeHttpPromise = {success: function () { }};
        scope.getNewsItems();
        spyOn(genericService, 'getAll');
        expect(genericService.getAll).toHaveBeenCalledWith('dashboard', 'currentnews');
    });

});

我有一个 genericService.getall() 的 spy 程序,但除此之外,我有点难以检查我的作用域变量是否已分配了值。

我还得到了这个堆栈跟踪:

Error: Expected spy getAll to have been called with [ 'dashboard', 'currentnews' ] but it was never called.
   at stack (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1441:11)
   at buildExpectationResult (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1408:5)
   at expectationResultFactory (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:533:11)
   at Spec.prototype.addExpectationResult (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:293:5)
   at addExpectationResult (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:477:9)
   at Anonymous function (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1365:7)
   at Anonymous function (file:///C:/Projects/2013/AMT2015/AMT2015.WebAPP/Scripts/tests/controllers/dashboardControllerSpec.js:49:9)
   at attemptSync (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1759:9)
   at QueueRunner.prototype.run (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1747:9)
   at QueueRunner.prototype.execute (file:///C:/Users/nickgowdy/Local%20Settings/Application%20Data/Microsoft/VisualStudio/12.0/Extensions/4sg2jkkc.gb4/TestFiles/jasmine/v2/jasmine.js:1733:5)

最佳答案

在调用测试函数之前,您需要先放置 spy 。实际上,您正在向服务函数传递更多参数。所以你需要使用确切的参数列表进行测试。

it('should assign data to scope', function() {
        //var fakeHttpPromise = {success: function () { }};
        spyOn(genericService, 'getAll');
        scope.getNewsItems();
        expect(genericService.getAll).toHaveBeenCalledWith('dashboard', 'currentnews',null,null,null);
    });

关于javascript - 如何测试我的服务是否使用 jasmine 和 angularjs 返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33824674/

相关文章:

javascript - 样式无法正常工作

angularjs - Angular 验证 : Rollback ngModel. $modelValue 更新?

javascript - 如何将字符串传递给 AngularJS 指令内的函数?

javascript - 使用 Karma-Jasmine 读取二进制文件

javascript - 如何为每个 Jasmine 测试重置 Knockout?

javascript - 将鼠标悬停在文本上,图像淡入淡出

javascript - 给定一个点和一个距离,计算 map 上的一个点

javascript - Jasmine 单元测试具有两个依赖项的 AngularJS 工厂($http 和另一个返回 promise 的工厂)

javascript - createProvider 不是从react-redux导出的?

javascript - AngularJs:无法切换两个元素的可见性