当前位置: 首页 > 面试题库 >

Jasmine,Karma,Angular如何在Angular应用上编写测试?

融唯
2023-03-14
问题内容

我刚刚跳到另一个项目,并且基本上,我被要求编写单元测试。因为我已经了解Protractor的e2e测试,所以我现在切换到Karma和Jasmine进行单元测试。我已经下载了业力,茉莉花,业力茉莉花和业力铬发射器。我也安装了角angular,所以应该准备开始了。我已经在互联网上阅读了很多东西,但是现在,我真正需要的是一个真实应用程序的具体示例,以弄清楚如何开始编写测试。我不需要简单的示例,但需要具体的示例和完整的说明。书籍和有用的链接也受到赞赏。预先感谢您的帮助/时间。


问题答案:
describe('ServiceBeingTested Name', (): void => {

var mockFirstDependency;
var mockSecondDependency;
var TestedService;

//Mock all dependencies
beforeEach((): void => {

    angular.mock.module('moduleServiceIsIn'); //Register the module which the service is in

    mockFirstDependency = sinon.stub(new MockFirstDependency());//Sinon if useful for mocking
    mockSecondDependency = sinon.stub(new MockSecondDependency());

    angular.mock.module(($provide): void => {
        $provide.value('FirstDependency', mockFirstDependency);
        $provide.value('SecondDependency', mockSecondDependency);
    });
});

beforeEach(inject(
    ['TestedService', (_TestedService_: TestedService): void => {
        TestedService = _TestedService_;
    }]));

//Describe each method in the service
describe('method to test', (): void => {

    it("should...", () => {
        //testing goes in here
        expect(TestedService.someMethod()).toBe("some value");
    });
});

这是如何测试角度服务的简单示例。在这种情况下,该服务称为TestedService。

您会看到的第一件事是三个变量声明。声明前两个以模拟出此服务的两个依赖关系(假定此服务具有两个依赖关系)。最后一个变量声明将分配给正在测试的实际服务。

现在在beforeEach中:

angular.mock.module

此行注册您要测试服务所在的模块。此行非常重要。

接下来的两行使用Sinon.js来模拟正在测试的服务的依赖关系。我建议研究Sinon.js

它的工作方式是我们有一个名为“ FirstDependency”的依赖项,我创建了一个存根并称为“
MockedFirstDependency”,在这里我创建了它的一个实例。

现在为下一部分(包括$ provide的部分)

$provide.value('FirstDependency', mockFirstDependency);

上面的代码行告诉Angular,每次使用FirstDependency服务时,请改用嘲笑FirstDependency。

现在,在下一个beforeEach之前,我要做的就是注入要测试的实际服务,并将其分配给全局变量。

然后让测试开始

编辑:测试控制器

describe('mainCtrl', (): void => {
    var $controllerConstructor;
    var MainCtrlInstance;
    var mockScope;
    var mockState;
    var mockStates;
    var mockGlobalData;

    beforeEach(() => {
        angular.mock.module('mainCtrlModule');

        mockScope = sinon.stub(new MockScope());
        mockState = sinon.stub(new MockState());
        mockStates = sinon.stub(new MockState());
        mockGlobalData = sinon.stub(new MockGlobalData());

        inject(($controller: ng.IControllerService): void => {
            $controllerConstructor = $controller;
        });

        //Constructs the controller, all dependencies must be injected here
        MainCtrlInstance = $controllerConstructor('mainCtrl',
            {
                '$Scope': mockScope,
                '$State': mockState,
                'States': mockStates,
                'srvGlobalData': mockGlobalData
            }
        );
    });

    describe('Method to Tests', (): void => {

        it("should...", (): void => {
            //Testing Begins
            expect(MainCtrlInstance.method()).toBe("some value");
        });
    });
});

编辑:测试指令

首先,你需要安装Html2JsPreprocessor用这个命令: NPM安装卡玛- NG-html2js预处理器–save-dev的
作为说这里。

karma.conf.js

files: [
    //Obviously include all of your Angular files
    //but make sure to include your jQuery before angular.js

    "directory/to/html/directive.html", // include html for directive
    "directive.js" // file directive is contained in
    "directive.spec.js"" // spec file
]

// include the directive html file to be preprocessed
preprocessors: {
    'directory/to/html/directive.html': 'ng-html2js'
},

plugins : [
    'karma-chrome-launcher',
    'karma-jasmine',
    'karma-ng-html2js-preprocessor' //include as a plugin too
],

ngHtml2JsPreprocessor: {
    //this part has a lot of useful features but unfortunately I
    //never got them to work, Google if you need help
},

指令

export class myDirectiveController {

    constructor(/*dependencies for controller*/) {
        //initializations
    }
    //other methods for directive class
}

export class myDirective implements ng.IDirective {
    constructor(/*dependencies for directive*/) { }
    static instance(/*dependencies*/): ng.IDirective {
        return new myDirective(/*dependencies for directive*/);
    }

    restrict = 'E';
    templateUrl = 'myDirective.html';
    controller = myDirectiveController;
    controllerAs = 'myDirectiveController';
    scope: {};
}

angular
.module('myDirectiveModule')
.directive('myDirective', myDirective.instance);

myDirective.spec.js

describe("myDirective", () => {

    //do you variable declarations but I'm leaving them out for simplicity

    beforeEach(() => {

        angular.mock.module(
            'myDirectiveModule', //and other modules in use
            'directory/to/html/directive.html'
            //include directive html as a module
        )

        // now do your mock dependencies as you did with services
        mockDependency = sinon.stub(new MockDependency());

        angular.mock.module(($provide): void => {
            $provide.value('dependency', mockDependency);
        }

        //inject $compile and $rootScope
        inject(($compile, $rootScope) => {

            scope = $rootScope.$new();

            // your directive gets compiled here
            element = angular.element("<my-directive></my-directive>");
            $compile(element)(scope);
            $rootScope.$digest();
            directiveController = element.controller('myDirective'); //this is your directive's name defined in .directive("myDirective", ...)
        });
    }

    describe("simple test", () => {

        it("should click a link", () => {

            var a = element.find("a");

            a.triggerHandler('click');

            //very important to call scope.$digest every you change anything in the view or the model
            scope.$digest();

            expect('whatever').toBe('whatever');
        });

    });
}

早些时候,当我说要在Angular之前包含jQuery文件时,要这样做是因为angular.element()会生成一个jQuery对象,可以在上面使用jQuery
API,但是如果不首先包含jQuery,则可以使用angular.element()返回一个jQLite对象,其中包含较少的方法。

调用scope。$ digest()也很重要,因为这将更新指令的绑定。



 类似资料:
  • 问题内容: 我想嘲笑。我想确保已经被调用了一定的次数,并且也已经被调用了。 我有以下代码: 在我的测试中,我有: 但是它给出了以下错误: TypeError:未定义不是对象(评估’angular.element(“#thing-” + Things [i] .id).attr’) 我还希望我的测试具有以下内容: 问题答案: 监视或模拟链接方法的方式仅取决于如何在被监视对象上定义它们。 在Angul

  • 我们有一套约1100个单元在ng测试中运行,目前在Angular 7.2.5中运行到4分钟内完成,没有故障,在Angular 8.0.0中运行到4分钟前完成,随机故障,减速和断开。 测试在Angular 7中成功运行,无论是在镀铬还是镀铬。 已尝试: 为了消除已知的样式元素内存泄漏,我们在此处实现了“样式清理”: 通过在1100个测试中的每个描述块中运行。 在《角度8》中,我们试图将业力从4.1.

  • 本文向大家介绍Angular 2 安装Jasmine测试框架,包括了Angular 2 安装Jasmine测试框架的使用技巧和注意事项,需要的朋友参考一下 示例 测试Angular 2应用程序的最常见方法是使用Jasmine测试框架。Jasmine允许您在浏览器中测试代码。 安装 首先,您需要的只是jasmine-core软件包(不是jasmine)。 校验 要验证Jasmine设置正确,请创建.

  • 问题内容: 我正在努力使用Karma + Jasmine测试AngularJS工厂。 我无法将工厂注入变量。 我究竟做错了什么? 注意:文件已正确加载 厂: 码: 输出: 问题答案: 您需要致电:

  • 我一直在想方设法为angular2、sass和ng2引导建立一个基础项目,该项目基于angular2种子项目,您可以在这里找到整个代码库:https://github.com/omargon/angular-seed-sass-ng2-bootstrap对于dev和prod发行版,所有内容都按预期进行了构建。但是,每当我尝试运行uni和e2e测试时,总是会出现以下错误: 欢迎任何帮助。