在实习生中加载项目目录之外的依赖项

jpe*_*zov 16 javascript dojo unit-testing amd intern

这个问题的答案并没有回答我的问题.

我想使用Intern作为我的测试框架从项目根目录外部加载依赖项.我目前正在使用以下目录结构:

www/
    project1/
        app/
        lib/
    project2/
        app/
        lib/
    intern-tests/
        node_modules/
        tests/
            functional/
                project1-tests/
                project2-tests/
            unit/
                project1-tests/
                project2-tests/
            intern.js
        Gruntfile.js
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在制作intern-tests自己的项目,并希望此目录能够保存我所有项目的所有测试.我已经设置了我的Gruntfile来执行使用grunt exec库将命令转换为的测试.一切正常,但我的单元测试无法加载和目录中的依赖项.grunt projectNamegrunt test --project=projectNameproject1/project2/

例如,这是我的单元测试之一:

define([
    'intern!object',
    'intern/chai!assert',
    'jquery',
    '../../../../project2/lib/js/var/document',
    '../../../../project2/lib/js/exports/file/functions/resizeInput'
], function(registerSuite, assert, $, document, resizeInput) {
    registerSuite({
        name: 'functions',
        resizeInput: function() {
            var $input = $(document.createElement('input'));
            resizeInput($input, 8, 20, 450, 200);
            assert.equal($input.width(), 450);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

并运行该测试给我以下错误:

SUITE ERROR
Error: Failed to load module ../project2/lib/js/var/document from
project2/lib/js/var/document.js (parent: tests/unit/project2/functions)
at HTMLScriptElement.handler  <__intern\node_modules\dojo\loader.js:517:27>
Run Code Online (Sandbox Code Playgroud)

如何从其他项目中包含这些外部文件?

jpe*_*zov 0

好吧,在有人提出更好的解决方案之前,我将在intern-tests/项目文件夹中创建符号链接。

要在 Windows 上执行此操作,如下所示:

mklink /j "c:\www\intern-tests\project-symlinks\project2" c:\www\project2
Run Code Online (Sandbox Code Playgroud)

它具有约定mklink /j "path\to\symlink" path\to\original(/j 表示连接)

在 Mac/Linux 上,您将执行以下操作:

ln -s /www/project2 /www/intern-tests/project-symlinks/project2
Run Code Online (Sandbox Code Playgroud)

它具有约定ln -s /path/to/original /path/to/symlink(-s 表示符号)

这看起来像下面这样:

www/
    project1/
        app/
        lib/
    project2/
        app/
        lib/
    intern-tests/
        project-symlinks/
            project1/
            project2/
        node_modules/
        tests/
            functional/
                project1-tests/
                project2-tests/
            unit/
                project1-tests/
                project2-tests/
            intern.js
        Gruntfile.js
Run Code Online (Sandbox Code Playgroud)

并将我的测试更改为以下内容:

define([
    'intern!object',
    'intern/chai!assert',
    'jquery',
    '../../../project-symlinks/project2/lib/js/var/document',
    '../../../project-symlinks/project2/lib/js/exports/file/functions/resizeInput'
], function(registerSuite, assert, $, document, resizeInput) {
    registerSuite({
        name: 'functions',
        resizeInput: function() {
            var $input = $(document.createElement('input'));
            resizeInput($input, 8, 20, 450, 200);
            assert.equal($input.width(), 450);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 如果您是唯一一个处理代码的人,那么这可能没问题,否则您必须让人员参与此过程。即使如此,如果您移动目录或更改名称会怎样?老实说,如果这些需要是单独的目录,您应该考虑将它们托管在某个地方,例如 github 或 npm 模块,然后通过 requirejs / browserify / webpack / 您喜欢的任何依赖项管理器将它们要求到您的项目中。每当项目必须在其根目录之外进行模块化时,使用依赖项管理就是合乎逻辑的下一步。 (2认同)