gpt4 book ai didi

angularjs - 使用 Jasmine : Compiling a template not working to verify data output in template 进行 Angular 1.x 测试

转载 作者:行者123 更新时间:2023-12-03 08:18:58 25 4
gpt4 key购买 nike

我正在尝试对一个 html 模板进行单元测试,该模板在段落、 anchor 标记和 {{header.title || 中具有变量translate}} 但是无论我尝试过什么帖子,它似乎都不起作用。我得到了检索到的 HTML 模板,当它被编译时它仍然是一样的。例如,在模板中我仍然看到 {{user}}。似乎它们都没有真正被编译。

当前模板输出:

<h1>{{header.title | translate}}</h1>
<h2>{{homeCtrl.name}}</h2>

预期输出:

<h1>Cake Blogger</h1>
<h2>Alexandria</h2>

测试套件:

(function() {
'use strict';

describe('home.tpl.html', function() {
var scope, controller, createController, template, element, rootScope;

beforeEach(module('Templates'));
beforeEach(module('mainApp'));

/**
@name: home.tpl.html
@description: Inject and set test related objects
@param {Service} rootScope - Used to get the language
@param {Compiler} $templateCache - Holding the compiled template
@param {Injector} $compile - Compiles an HTML string or DOM
*/
beforeEach(inject(
function(_$controller_, _$rootScope_, $templateCache, $compile) {
scope = _$rootScope_.$new();
createController = function() {
return _$controller_('homeCtrl', {
'$scope': scope
});
};

controller = createController();

rootScope = _$rootScope_;
template = $templateCache.get('home.tpl.html');
element = $compile(template)(rootScope);

// var ctrl = element.controller('homeCtrl');
rootScope.$digest();
console.log("home page", element);
}));

/**
@name: Describe Block - home.tpl.html
@description: Test cases related to home.tpl.html
*/
describe('home.tpl.html tests', function() {
fit('should have "Alexandria"', function() {
expect(element.html()).toContain("Alexandria");
});
});
});
})();

karma 文件:

files: ['list of files'],

port: 8080,

browsers: [
'PhantomJS'
],

plugins: [
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-ng-html2js-preprocessor',
],

preprocessors: {
'app/**/*.tpl.html': 'html2js'
},

ngHtml2JsPreprocessor: {
'moduleName': 'Templates',
'stripPrefix': 'app/'
}

package.json

{
"name": "",
"private": true,
"devDependencies": {
"autoprefixer-core": "^5.2.1",
"grunt": "^0.4.5",
"grunt-angular-templates": "^0.5.7",
"grunt-concurrent": "^1.0.0",
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-compass": "^1.0.0",
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-connect": "^0.9.0",
"grunt-contrib-copy": "^0.7.0",
"grunt-contrib-cssmin": "^0.12.0",
"grunt-contrib-htmlmin": "^0.4.0",
"grunt-contrib-imagemin": "^1.0.0",
"grunt-contrib-jshint": "^0.11.0",
"grunt-contrib-uglify": "^0.7.0",
"grunt-contrib-watch": "^0.6.1",
"grunt-filerev": "^2.1.2",
"grunt-google-cdn": "^0.4.3",
"grunt-jscs": "^1.8.0",
"grunt-karma": "*",
"grunt-modernizr": "^1.0.2",
"grunt-newer": "^1.1.0",
"grunt-ng-annotate": "^0.9.2",
"grunt-ng-constant": "^2.0.1",
"grunt-postcss": "^0.5.5",
"grunt-svgmin": "^2.0.0",
"grunt-usemin": "^3.0.0",
"grunt-wiredep": "^2.0.0",
"jasmine-core": "^2.4.1",
"jit-grunt": "^0.9.1",
"jshint-stylish": "^1.0.0",
"karma": "^0.13.22",
"karma-coverage": "^0.5.5",
"karma-fixture": "^0.2.6",
"karma-jasmine": "*",
"karma-json-fixtures-preprocessor": "0.0.6",
"karma-json-preprocessor": "^0.3.3",
"karma-junit-reporter": "^1.2.0",
"karma-ng-html2js-preprocessor": "~0.1.0",
"karma-phantomjs-launcher": "*",
"phantomjs": "^2.1.7",
"time-grunt": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
},
"scripts": {
"test": "grunt test"
},
"dependencies": {}
}

根据我读过的帖子,例如来自帖子 plunker example 的这个 plunker ,这应该可以正常工作。我在想也许 Controller 没有绑定(bind)到范围,所以当 $digest 运行时模板可能找不到 Controller 。

有用信息:

  • 它说 rootscope.$digest() 我也试过它作为 scope.$digest(),我也试过使用 $apply()
  • 我正在使用 ngHtml2JsPreprocessor
  • 我正在使用 TemplateCache
  • 我正在使用 $compile

查看的链接:

模板返回,但模板中的 Angular 永远不会编译。总是看到 {{homeCtrl.name}} 而不是 Alexandria

更新 1.1

我想也许是因为翻译 {{header.title | translate}} 不工作,也许 angular-translate(模块:pascalprecht.translate)实际上没有正常工作,然后导致 Controller 也失败捆绑。将继续调查。

最佳答案

在注入(inject) angular-translate 之后 | translate 过滤器正常工作并在 $compile 后产生预期的翻译值。以这个 plunker 为例:

http://plnkr.co/edit/j8rbnMI067YntllwTcGi?p=preview

导致您出现问题的一个可能原因是时间安排 - 假设您有很大的翻译数组/json 并且需要一段时间才能加载,但 Jasmine 测试已经开始并在它们完全加载和准备就绪之前完成。然后 Jasmine 将在测试期间看到未翻译的字符串。


2017-06-30 更新

经过几次实验,我可以确认任何异步 json 加载器,无论是 .useStaticFilesLoader 还是 $.getJSON(),都不会在 jasmine 之前执行。参见 http://plnkr.co/edit/nreUd52iqOVvwLPMNtJA?p=preview例如,静态加载器可以很好地用于页面 View ,但单元测试失败。

一种可能的方法是完全放弃 .useStaticFilesLoader。相反,我们可以使用 grunt-replace 在构建过程中注入(inject)翻译。示例 grunt 任务:

// replace string with json
replace: {
dist: {
options: {
patterns: [
{
match: /\"JSONEN\"/,
replacement: '<%= grunt.file.read("app/resources/en.json") %>'
}
]
},
files: [
{expand: true, flatten: true, src: ['app/scripts/app.js'], dest: 'public/'}
]
}
}

关于angularjs - 使用 Jasmine : Compiling a template not working to verify data output in template 进行 Angular 1.x 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com