对于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)
- 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)
|--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的实现原理
源代码: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
<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列入白名单,只需允许这一个实例.
解决方法
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文件
向每个文件添加一个IIFE,然后添加“use strict”是无聊的。
有什么办法自动化吗?我使用gulp来运行任务。
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中的父控制器范围变量
<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中解决这个问题?
var controllerInstance; beforeEach(inject(function ($controller,$rootScope) { scope = $rootScope.$new(); scope.myReferencedobject = {someProperty: 'hello world'} controllerInstance = $controller('childController',{ $scope: scope }); }));
今天关于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中的父控制器范围变量等更多相关知识的信息可以在本站进行查询。
本文标签: