gpt4 book ai didi

javascript - 如何将 testr 与 karma-jasmine 适配器一起使用?

转载 作者:行者123 更新时间:2023-12-02 16:21:07 25 4
gpt4 key购买 nike

一切正常(Karama、Jasmine、Underscore、Backbone、testr),如 _UnitTestUnitTest 通过所示。 但是简单的 testr 语句总是会失败。

基本的 _UnitTestUnitTest 有效!

it('works for jquery', function() {
expect( $("document")).toBeTruthy();
});

it('works for underscore', function() {
expect(_.size([1,2,3])).toEqual(3);
});
it('works for backbone', function() {
var model = Backbone.Model.extend();
expect(model).toBeTruthy();
});
it('works for testr', function() {
expect(testr).toBeTruthy();
});

但是,在我的另一个真实单元测试中,它在 testr 行上失败了:

AccountSummaryCollection_CLASS = testr('models/sales-rep/AccountSummaryCollection');

我确定我在配置中正确包含了“models/sales-rep/AccountSummaryCollection”的依赖项(我看到它由 require.js deps 托管并加载!!!

然而,最大的问题是它声称我们的应用程序模块没有加载,尽管它已经加载了。我还尝试将整个 AccountSummaryUnitTest.js 包装在 require(['AccountSummaryCollection'], function(){…. 内,这会产生一个新错误,其中依赖项 (AccountSummary.js) 中的错误“Backbone is not Defined” 被抛出。这在上下文中没有任何意义,因为显然 AccountSummaryCollection 已经解析了 Backbone.Collection。这个糟糕的解决方案让我怀疑 testr 是可疑的。

我还尝试使用 karma 配置手动包含该文件,但 requirejs 不喜欢这样做,因为它是一个冲突的 Define() 函数。

如下: serving 实际上意味着由客户端请求,并且 {{{dependency}}} 文件是我自己的跟踪,以确认它们是添加到 karma-spec-runner.js 中的 deps 列表中。

在这一行失败:AccountSummaryUnitCollection 第 27 行:AccountSummaryCollection_CLASS = testr('models/sales-rep/AccountSummaryCollection');

这是“spec runner”javascript(基本上是从文档复制的,带有一些额外的日志记录)。

var dependencies = [];
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {
//
if (/Test\.js$/.test(file)) {
//traces my test files fine!
console.log("{{{testing file}}} --> "+ file );
dependencies.push(file);
}
}
}

// jam our application files into the deps
for (var file in window.__karma__.files) {
if (window.__karma__.files.hasOwnProperty(file)) {

if (file.indexOf('src/main/app/') !== -1 ) {
//traces my dep files fine!
console.log("{{{dependency}}} file --> "+ file );
dependencies.push(file);
}
}
}


require.config({
baseUrl: 'base/src/main/app/',
paths: {
'resources' : '../resources/',
'jquery' : '../resources/js/lib/jquery-2.1.0.min',
'text' : '../resources/js/lib/text-2.0.10',
'i18n' : '../resources/js/lib/i18n-2.0.4',
'd3' : '../resources/js/lib/d3.v3.1.10.min',
'AppMeasurement' : '../resources/js/lib/appMeasurement',
'underscore' : '../resources/js/lib/underscore-1.5.2',
'Backbone' : '../resources/js/lib/backbone-1.1.2.min',
'testr' : '../../test/lib/testr'
},
deps: dependencies,
shim: {
d3: {
exports: 'd3'
},
AppMeasurement: {
exports: 'AppMeasurement'
},
underscore: {
deps:["jquery"],
exports: '_'
},
Backbone: {
deps:["jquery"],
exports: 'Backbone'
},
testr:{
exports: 'testr'
}
},
callback: window.__karma__.start,
locale: "en-us"
});

这是我的 grunt 文件的 karma 部分

karma: {
unit: {
background: false,
options: {
logLevel : 'debug',

basePath:'./',

// files for karma to host
files: [

{pattern: 'src/main/resources/js/lib/**/*.js', included: false, served: true},
{pattern: 'src/main/resources/js/plugins/**/*.js', included:false, served: true },

{pattern: 'src/test/lib/sinon.js', included: false },
{pattern: 'src/test/lib/testr.js', included: false },

{pattern: 'src/test/js/stubs/**/*.js', included: false, served: true},

// manually load our application unit test & deps to examine the simplest case
{pattern:'src/main/app/models/sales-rep/AccountSummary.js', included: false },
{pattern:'src/main/app/models/sales-rep/AccountSummaryCollection.js', included: false },

{pattern: '_UnitTestUnitTest.js', included: false},
{pattern: 'src/test/js/unit/AccountSummaryCollectionUnitTest.js', included: false},

'src/test/js/karma-spec-runner.js'

],
plugins: [
"karma-jasmine",
"karma-phantomjs-launcher",
"karma-requirejs",
'karma-chrome-launcher',
],
frameworks: [
"jasmine",
"requirejs"
],
browsers: [
//"PhantomJS"
"Chrome"
]
}
}
},

这是一个失败的示例测试

请注意,testr 配置是针对每个单元测试的。另外,此测试可以在 jasmine 浏览器中以普通方式进行!

// tried with and without the leading require statement as noted in main question.
require( ['models/sales-rep/AccountSummaryCollection'], function() {

describe('AccountSummaryCollectionUnitTest', function () {

var AccountSummaryCollection_CLASS;
function configureTestr() {
testr.config({
whitelist: [
'models/sales-rep/AccountSummaryCollection',
'models/sales-rep/AccountSummary'
]
});
}

beforeEach(function () {
configureTestr();
console.log("initializing AccountSummaryCollection_CLASS");
//fails on following line
AccountSummaryCollection_CLASS = testr('models/sales-rep/AccountSummaryCollection');
});

enter image description here

最佳答案

您需要特定版本的库才能使其正常工作:

  • testr 1.0.2(不是 1.0.3!!!!!)
  • Backbone 1.0.0(由于某种原因不是 1.1.2)
  • 下划线1.6
  • require-2.1.11 [生产](由于某种原因我们有 2.1.2)

然后我必须在 Karma 配置中 include:true 作为下划线和 Backbone 。然后该填充程序可与 require 2.1.11 一起使用,而不会出现不匹配的匿名定义错误。

此外,还要确保延迟测试执行。我对 waitSeconds 没有运气(这只会增加测试持续时间)。

require配置的关键部分:

    // since we are forcing Backbone in the dom instead of requiring it
callback: function(){
setTimeout(function () {
window.__karma__.start();
}, 4000);
},

关于javascript - 如何将 testr 与 karma-jasmine 适配器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232532/

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