Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块

Posted

技术标签:

【中文标题】Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块【英文标题】:Mismatched anonymous define() module in unit testing with Karma + Jasmine + Durandal + KnockoutJS + RequireJS 【发布时间】:2020-05-09 19:30:02 【问题描述】:

通过 Karma 为 Asp.Net MVC 项目使用 Durandal 包装器在 KnockoutJS + RequireJS 上实现 Jasmine 单元测试时出现问题。下面是示例代码:

karma.conf.js

    config.set(
        basePath: '',
        files: [            
             pattern: '../scripts/jasmine/boot.js', included: false ,
             pattern: '../scripts/knockout-3.4.0.js', included: false ,
             pattern: '../scripts/jquery-1.9.1.js', included: false ,
             pattern: 'node_modules/**/*-min.js', included: false ,
             pattern: '../app/durandal/app.js', included:false,
            'TestScripts/test-main.js',
            'TestScripts/DefaultTestSpec.js',
        ],
        frameworks: ['jasmine', 'requirejs'],
        plugins: [
            require('amd-loader'),
            require('karma-jasmine'),
            require('karma-chrome-launcher'),
            require('karma-requirejs')
        ],
        client: 
            clearContext: false 
        ,
        reporters: ['progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['Chrome'],
        singleRun: true
    );
; 

test-main.js

var TEST_REGEXP = /(spec|test)\.js$/i;
var BASE_URL = '/base/build/js';
var BASE_URL_REGEXP = /^\/base\/build\/js\/|\.js$/g;

for (var file in window.__karma__.files) 
    if (window.__karma__.files.hasOwnProperty(file)) 
        if (/Spec\.js$/.test(file)) 
            tests.push(file);
        
    

require.config(
    baseUrl: '/TestScripts',
    paths: 
        'env': 'env',
        'jquery': '../../scripts',
        'underscore': '../../node_modules/underscore/',
        'knockout': '../../scripts/',
        'require': '../../app/durandal/amd/require',
        'app':'../../app/durandal/app.js',
        ,

    shim: 
        'underscore': 
            exports: '_'
        
    ,
    deps: tests,
    callback: window.__karma__.start
);

DefaultTestSpec.js

define(['ViewModel'], function (InitVM) 

    describe("MyTestSpecTest", function () 
        it("should be able to connect to View Model file", function () 
            expect(vm.id()).toBe(1);
        );
    );
);

测试 JS 视图模型

define(function processView(require) 
function initVM(mode, data, InterfaceName) 
this.id = ko.observable(1);
var vm = this;
        return vm;
)
return InitVM;
)

如果需要将视图模型的 html 文件包含到 karma.conf.js 中的 test-main 或路径中?在发布问题时,错误消息是 - Uncaught Error: Mismatched anonymous define() module: function Uncaught Error: Mismatched anonymous define() module: function

可能是什么原因导致或配置文件中缺少某些内容?

【问题讨论】:

【参考方案1】:

检查用 karma.conf.js 编写的文件路由解决了错误。路由应该相对地取自 karma.conf.js 存储的目录。查看目录示例:

$ tree
.
|-- index.html
|-- karma.conf.js
|-- lib
|   |-- jquery.js
|   |-- require.js
|   `-- underscore.js
|-- scripts
|   |-- app.js
|   `-- main.js
`-- test
    |-- appSpec.js
    `-- test-main.js

所以 karma.conf.js 中的正确路由应该是这样的:

config.set(
    files: [            
                 pattern: 'scripts/app.js', included: false ,
                 pattern: 'scripts/main.js', included: false ,
            ]
   );

【讨论】:

以上是关于Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块的主要内容,如果未能解决你的问题,请参考以下文章

如何安装和使用Karma-Jasmine

karma-jasmine-html-reporter@1.1.0 需要 jasmine@>=3 的对等方,但没有安装。

Karma 与测试框架 Jasmine、Mocha、QUnit [关闭]

Angular - Jasmine/karma - 订阅 lambda 表达式未执行

在Visual Studio 2013中使用Jasmine + Karma进行AngularJS测试

如何用 jasmine-karma 覆盖函数的所有行