GVKun编程网logo

javascript – 单元测试Angular Browserify Gulp和Jasmine(javascript unit test)

15

对于javascript–单元测试AngularBrowserifyGulp和Jasmine感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解javascriptunittest,并且为您提供

对于javascript – 单元测试Angular Browserify Gulp和Jasmine感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解javascript unit test,并且为您提供关于Angular jasmine单元测试框架里describe的实现原理、angularjs – Angular sce.trustAsUrl和javascript hrefs、angularjs – 使用Gulp来包装一个IIFE的javascript文件、angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量的宝贵知识。

本文目录一览:

javascript – 单元测试Angular Browserify Gulp和Jasmine(javascript unit test)

javascript – 单元测试Angular Browserify Gulp和Jasmine(javascript unit test)

我正在使用Gulp与browserify捆绑一个角度项目.这是树

|--app
  |--src
    --js
      -main.js
      -otherFiles.js
  |--spec
    --mainspec.js <-- jasmin spec file
|--public
   --js
     --main.js

我有一个gulp文件,它接受我的source,main.js文件,并将其与gulp-jasmine任务一起浏览

gulp.task('js',function() {
   return gulp.src('src/js/main.js')
    .pipe(browserify({}))
    .pipe(gulp.dest('public/js'));
});

gulp.task('specs',function () {
return gulp.src('spec/*.js')
    .pipe(jasmine());
});

除了一些观察任务等.

现在,在我的mainspec.js文件中,考虑到我的测试代码,无法识别angular:

describe("An Angular App",function() {
   it("should actually have angular defined",function() {
     expect(angular).tobedefined();
  });
});

我得到一个ReferenceError:终端上没有定义角度的错误.我试图要求(‘有角度’);在第一行但没有运气,得到一个新的错误ReferenceError:窗口没有定义.我知道设置和测试文件无法访问浏览器化文件有问题,但我不能找出解决方案.

有任何想法吗?

提前致谢.

解决方法

您需要在配置文件中定义所有方面

function getKarmaConfig(environment) {
    return {
        frameworks   : ['jasmine'],files        : [
            // Angular + translate specified for build order
                    environment + '/js/jquery.min.js',environment + '/js/angular.js',environment + '/js/angular-translate.min.js',environment + '/js/**/*.js','bower_components/angular-mocks/angular-mocks.js','test/unit/**/*.js'
        ],exclude      : [
        ],browsers     : ['PhantomJS'],reporters    : ['dots','junit','coverage'],junitReporter: {
            outputFile: 'test-results.xml'
        },preprocessors : {
              'prod/js/*.js': ['coverage']
        },coverageReporter:{
              type: 'html',dir: 'coverage'
        }
    };
};

并定义像这样的gulp测试任务

gulp.task('test',['build_prod'],function () {
    var testKarma = getKarmaConfig(environment);
    testKarma.action = 'run';
    testKarma.browsers = ['PhantomJS'];
    return gulp.src('./fake')
            .pipe(karma(testKarma));
});

您只需要根据您的结构完美地定义src.这将工作:)

Angular jasmine单元测试框架里describe的实现原理

Angular jasmine单元测试框架里describe的实现原理

源代码:describe函数传入的两个参数:描述信息和箭头函数:

从注释能看出,describe函数的语义:Create a group of specs (often called a suite)

getJasmineRequireObj().interface = function(jasmine, env) {
   
   
   
  var jasmineInterface = {
   
   
   
    /**
     * Callback passed to parts of the Jasmine base interface.
     *
     * By default Jasmine assumes this function completes synchronously.
     * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment.
     * @callback implementationCallback
     * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
     * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
     */

    /**
     * Create a group of specs (often called a suite).
     *
     * Calls to `describe` can be nested within other calls to compose your suite as a tree.
     * @name describe
     * @since 1.3.0
     * @function
     * @global
     * @param {String} description Textual description of the group
     * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
     */
    describe: function(description, specDefinitions) {
   
   
   
      return env.describe(description, specDefinitions);
    },

参数定义

  • description:Textual description of the group
  • specDefinitions: Function for Jasmine to invoke that will define inner suites and specs

从这里能看出,单元测试代码运行于一个特定的zone里:

 // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
        var jasmineEnv = jasmine.getEnv();
        [''describe'', ''xdescribe'', ''fdescribe''].forEach(function (methodName) {
   
   
   
            var originalJasmineFn = jasmineEnv[methodName];
            jasmineEnv[methodName] = function (description, specDefinitions) {
   
   
   
                return originalJasmineFn.call(this, description, wrapDescribeInZone(specDefinitions));
            };
        });

addSpecsToSuite:

添加Specs到Suite之后,执行:

 /**
         * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
         * synchronous-only zone.
         */
        function wrapDescribeInZone(describeBody) {
   
   
   
            return function () {
   
   
   
                return syncZone.run(describeBody, this, arguments);
            };
        }

在一个同步zone里执行spec的body,即传入describe方法的箭头函数:

callback就是应用程序单元测试代码里定义的箭头函数:

即如下图所示:

更多Jerry的原创文章,尽在:“汪子熙”:

本文同步分享在 博客“汪子熙”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

angularjs – Angular sce.trustAsUrl和javascript hrefs

angularjs – Angular sce.trustAsUrl和javascript hrefs

我正在尝试创建一个具有书签的页面,如下所示:

<a ng-href="{{getBookmarklet()}}">Bookmarklet</a>

function MyCtrl($scope) {
  $scope.getBookmarklet = function() {
     return 'javascript:alert(1)';
  }
}

href被清理为不安全:javascript:alert(1).所以,我尝试过使用sce.trustAs来防止这种情况:

function MyCtrl($scope,$sce) {
  $scope.getBookmarklet = function() {
     return $sce.trustAsUrl('javascript:alert(1)');
  }
}

但是,我仍然在我的网址上获得“不安全”前缀.我也尝试过trustAsJs,没有运气.我不想在我的应用程序中使用compileProvider将javascript:URL列入白名单,只需允许这一个实例.

解决方法

我遇到了这个问题,并且能够通过使用$sce.trustAsHtml()来解决它.

JS:

function MyCtrl($scope,$sce) {
  $scope.getBookmarklet = function() {
    return $sce.trustAsHtml('<a href="javascript:alert(1)">Bookmarklet</a>');
  }
}

HTML:

<ng-bind-html ng-bind-html="::getBookmarklet()"></ng-bind-html>

这可能会引起CSS和其他指令的问题,但这些问题通常可以解决.

angularjs – 使用Gulp来包装一个IIFE的javascript文件

angularjs – 使用Gulp来包装一个IIFE的javascript文件

我有一个有角度的应用程序有很多.js文件。
向每个文件添加一个IIFE,然后添加“use strict”是无聊的。

有什么办法自动化吗?我使用gulp来运行任务。

使用 the gulp-wrap plugin与一个简单的模板:
var wrap = require("gulp-wrap");

gulp.src("./src/*.js")
    .pipe(wrap('(function(){\n"use strict";\n<%= contents %>\n})();'))
    .pipe(gulp.dest("./dist"));

这将包含每个文件的内容与模板:

(function(){
"use strict";
//contents here…
})();

您还可以将模板存储在文件系统上,而不是将其嵌入到gulpfile中,并使用wrap({src:’path / to / template’})调用gulp-wrap

angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量

angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量

我在页面上有两个控制器.它们被“包裹”在 HTML标记上,其中一个是“父”,另一个是“子”,如下所示:
<div id="parent" ng-controller="parentController">
    <div id="child" ng-controller=childController">
    </div>
</div>

在我的控制器的JS文件中,我从“子”控制器中的“父”控制器引用一个对象.

家长控制器:

angular.module('myApp').controller('parentController',function($scope){
    $scope.myReferencedobject = {};
    $scope.myReferencedobject.someProperty = "hello world";
});

儿童控制器:

angular.module('myApp').controller('childController',function($scope){
    $scope.childControllerVariable = $scope.myReferencedobject.someProperty;
});

因为“子”控制器嵌套在“父”控制器中,所以来自父控制器的对象在子控制器中继承.

这在Karma测试中不起作用,因为所有文件都被分解为单独的单元并单独测试.在进行单元测试时,$scope.myReferencedobject.someProperty引用在我的“子”控制器中是未定义的,因为没有原型继承.

我如何在Karma中解决这个问题?

您可以在测试内部控制器时将$scope初始化为您想要的任何内容,这样您就可以模拟父控制器在其上设置的内容
var controllerInstance;
beforeEach(inject(function ($controller,$rootScope) {
    scope = $rootScope.$new();
    scope.myReferencedobject = {someProperty: 'hello world'}
    controllerInstance = $controller('childController',{
      $scope: scope
    });
}));

今天关于javascript – 单元测试Angular Browserify Gulp和Jasminejavascript unit test的介绍到此结束,谢谢您的阅读,有关Angular jasmine单元测试框架里describe的实现原理、angularjs – Angular sce.trustAsUrl和javascript hrefs、angularjs – 使用Gulp来包装一个IIFE的javascript文件、angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量等更多相关知识的信息可以在本站进行查询。

本文标签: