angularjs - 如何在 Jasmine 中模拟 $scope.variables

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

我有以下测试用例 CompanyCtrlSpec.js

describe('ViewCompanyCtrl', function () {
    var $rootScope, scope, $controller , $q ;

   beforeEach(angular.mock.module('MyApp'));

   beforeEach(inject(function ($rootScope, $controller ) {
        scope = $rootScope.$new();
        createController = function() {
            return $controller('ViewCompanyCtrl', {
            $scope: scope,
            company : {}    
            }); 
        };
    }));

    it('the company type should be equal to an object', function () {
        var controller = new createController();
        //some assertion
    });
});

以下是ViewCompanyCtrl.js文件

angular.module('MyApp').controller('ViewCompanyCtrl',
    function ($scope, companyService, $state, meetingService, company, attachmentService) {
        'use strict';

        $scope.company = company;

        $scope.companyInfo = {};
        $scope.companyInfo['AName'] = [$scope.company.Address.Street, $scope.company.Address.ZipCode + ' ' + $scope.company.Address.City].join(', ');
       //more code


    });

以下是 app.routes.js 文件,其中 company 得到解决

.state('company', {
            abstract: true,
            url: '/company/:companyId',
            resolve: {
                company: function($q, $stateParams, companyService){
                    var deferred = $q.defer();

                    companyService
                        .getCompany($stateParams.companyId)
                        .error(function(data, status, headers){
                            //more code
                        })
                        .success(function(data){
                            deferred.resolve(data);
                        });

                    return deferred.promise;
                }
            },

我的问题是出现以下错误

        TypeError: $scope.company.Address is undefined in C:/Users/MyApp/WebApiRole/app/compan
y/ViewCompanyCtrl.js (line 8)
        @C:/Users/MyApp/WebApiRole/app/company/ViewCompanyCtrl.js:8:42

我猜这是因为我没有在我的测试用例中模拟 scope.company.Address 。我不知道该怎么做。如果有人可以帮助我解决这个问题,或者有什么方法可以帮助我,我将不胜感激?

最佳答案

在我看来,$scope.company 与注入(inject) Controller 的 company 相同。因此,您只需在要注入(inject)模拟的 company 上设置一个 Address,如下所示:

beforeEach(inject(function ($rootScope, $controller ) {
    scope = $rootScope.$new();
    createController = function() {
        return $controller('ViewCompanyCtrl', {
            $scope: scope,
            company : {
                Address: {/* address data goes here */}
            }
        }); 
    };
}));

如果您希望每次测试的公司数据都不同,只需将其传递到您的 createController() 函数中即可:

beforeEach(inject(function ($rootScope, $controller ) {
    scope = $rootScope.$new();
    createController = function(company) {
        return $controller('ViewCompanyCtrl', {
            $scope: scope,
            company : company
        }); 
    };
}));

it('the company type should be equal to an object', function () {
    var company = {Address: {/* address data goes here */}};
    var controller = new createController(company);
    //some assertion
});

关于angularjs - 如何在 Jasmine 中模拟 $scope.variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570617/

相关文章:

javascript - 选中/取消选中复选框时切换特定的 Highcharts

php - Laravel angularjs Request::ajax() 总是错误的

unit-testing - 我们如何使用angulardart中的测试包对异步函数进行单元测试?

python - 配置coverage.py以不使用迁移

android - Android 上的 ionic : redirected image sources break ng-src

angularjs - 如何在没有 ng-repeat 的情况下在 Angularjs 中实现 "Load more"分页?

c++ - 从指定输入和预期结果的场景表生成单元测试

angularjs - Angular jqLit​​e : . find() 不起作用 - 不选择标签

css - Protractor 图像没有在对话框中上传?

javascript - 如果提供相等的类,angular2 测试中的 useClass 字段是否有任何区别?