2

我的出发点是Yeoman Backbone Generator。我已经正确设置并运行它。

而不是每次我想测试时都必须手动运行grunt test,我宁愿让它在每次文件更改时自动运行测试。

我希望仍然能够运行grunt server它目前给我的所有令人敬畏的东西。有没有办法在这个繁重的任务中添加持续集成(这是正确的词吗?我对此有点陌生)?

或者最好不要触摸grunt server并从根本上消除grunt test并用在单独的终端(如 Testem 或 Karma)中运行的东西替换它。

或者像 Testem 或 Karma 这样的东西可以通过一项繁重的任务使用而不会丢失有用的功能。

4

1 回答 1

1

当你使用生成器时,它应该已经创建了一个带有watch task的 Gruntfile 。

使用新生成的项目,服务器任务已运行该watch任务:

grunt.registerTask('server', function (target) {
    if (target === 'dist') {
        return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
    } else if (target === 'test') {
        return grunt.task.run([
            'clean:server',
            'coffee',
            'createDefaultTemplate',
            'jst',
            'compass:server',
            'connect:test:keepalive'
        ]);
    }

    grunt.task.run([
        'clean:server',
        'coffee:dist',
        'createDefaultTemplate',
        'jst',
        'compass:server',
        'connect:livereload',
        'open',
        'watch'    // <==== Here
    ]);
});

Watch能够在文件更新时运行任务。在那里添加您的测试任务。

watchyo 主干生成的示例配置:

watch: {
    options: {
        nospawn: true
    },
    coffee: {
        files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],
        tasks: ['coffee:dist']
    },
    coffeeTest: {
        files: ['test/spec/{,*/}*.coffee'],
        tasks: ['coffee:test']
    },
    compass: {
        files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
        tasks: ['compass']
    },
    livereload: {
        options: {
            livereload: LIVERELOAD_PORT
        },
        files: [
            '<%= yeoman.app %>/*.html',
            '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
            '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
            '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'
        ]
    },
    jst: {
        files: [
            '<%= yeoman.app %>/scripts/templates/*.ejs'
        ],
        tasks: ['jst']
    }
}

假设您运行主干生成器以使用 Mocha 作为测试框架。

你会在你的这些部分Gruntfile.js

connect配置一个不同于应用程序端口 9000 的端口下:

connect: {
    …
    test: {
        options: {
            port: 9090,  // <== Add this here
            middleware: function (connect) {
                return [
                    mountFolder(connect, '.tmp'),
                    mountFolder(connect, 'test'),
                    mountFolder(connect, yeomanConfig.app)
                ];
            }
        }
    },
    …
},

在 Mocha 配置下更改它用于引用的端口connect.test.options.port

    mocha: {
        all: {
            options: {
                run: true,
/* change ==>*/ urls: ['http://localhost:<%= connect.test.options.port %>/index.html']
            }
        }
    },

作为注册的任务:

grunt.registerTask('test', [
    'clean:server',
    'coffee',
    'createDefaultTemplate',
    'jst',
    'compass',
    'connect:test',
    'mocha'
]);

watch添加测试目标下 - 如下所示:

    test: {
        files: [
            '<%= yeoman.app %>/*.html',
            '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
            '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
            '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}'
        ],
        tasks: ['test']
    }

通过这些更改,只要文件更改与test.filesglob 匹配,test任务就会运行。

使其适用于您的代码的确切步骤将取决于您选择的测试框架和 grunt 插件。除了入门 - 安装插件配置任务指南之外,请查看您的测试插件文档以确保您很好地了解其特定配置的工作原理。

您确实在答案中提到了两个测试框架。我没有使用过其中任何一个,但都有可用的 grunt 插件。

如果这些一般步骤仍然没有帮助,如果您可以提供有关您的项目的更多细节,包括您Gruntfile.js选择的测试框架、您尝试过的内容以及您看到的错误/失败,将会很有帮助。

于 2013-09-06T23:29:43.717 回答