如何在规范中使用 require - 节点中的 grunt + karma + jasmine

2023-12-19

模糊版本问题:

  • 如何在 grunt 规范中使用 require ?

Context:

我正在开发一个尚未测试的现有节点项目,所以我阅读了一些内容并意识到使用 karma 和 jasmine。

我读了一些教程(包括这些):

  • http://kwilson.me.uk/blog/use-karma-and-grunt-to-run-your-jasmine-tests-in-real-time/ http://kwilson.me.uk/blog/use-karma-and-grunt-to-run-your-jasmine-tests-in-real-time/
  • http://ahexamples.blogspot.com.br/2014/03/example-of-jasmine-karma-sonar-grunt.html http://ahexamples.blogspot.com.br/2014/03/example-of-jasmine-karma-sonar-grunt.html

所以我尝试用 grunt 运行我的规范并收到此错误:

X遇到声明异常 ReferenceError:找不到变量:在 file:///(...)-spec.js 中需要(第 2 行)(1)

该行是这样的:

var myHelper = require(...);

但如果我通过终端“node-jasmine test”使用它就像一个魅力......

我的项目结构:

  • 控制器/
  • helpers/
  • models/
  • 节点模块/
  • 资源/
  • test/
  • 测试/规格/
  • views/
  • app.js
  • Gruntfile.js
  • 包.json

在我的规范(在 test/spec/ 内)中,我使用了 require('../../helpers/helper.js') ,这对于 node-jasmine 来说没问题,但对于 grunt 来说不行。

节点茉莉花测试:

.....

在 0.015 秒内完成 5 次测试,5 次断言,0 次失败,0 次跳过

grunt:

运行“jasmine:pivotal”(茉莉花)任务通过测试茉莉花规格 PhantomJS

ReferenceError:找不到变量:需要在 app.js:1 Service Helper Tests X 遇到声明异常 ReferenceError:找不到变量:在文件中需要::///(...)/test/spec/serviceHelper-spec.js (第 2 行)(1)

0.005 秒内 1 个规格。

1 次失败警告:任务“jasmine:pivotal”失败。使用 --force 继续。

由于警告而中止。

我已将所有包安装到 node_modules 中(package.json 中的依赖项中没有任何内容),我的 Gruntfile.js 是:

'use strict';

module.exports = function(grunt) {
    var $srcFiles = 'app.js';
    var $testFiles = 'test/spec/*-spec.js';
    var $outputDir = 'test/target'
    var $junitResults = $outputDir + '/junit-test-results.xml';
    var $jasmineSpecRunner = $outputDir + '/_SpecRunner.html';
    var $coverageOutputDir = $outputDir + '/coverage';


    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        // Jasmine test
        jasmine: {
            pivotal: {
                src: $srcFiles,
                options: {
                    specs: $testFiles,
                    outfile: $jasmineSpecRunner,
                    keepRunner: 'true'  // keep SpecRunner/outfile file
                }
            }
        },

        // coverage using Karma
        karma: {
            continuous: {
                singleRun: 'true',
                browsers: [ 'PhantomJS' ]
            },

            options: {
                plugins: [
                    'karma-jasmine',
                    'karma-phantomjs-launcher',
                    'karma-junit-reporter',
                    'karma-coverage'
                ],
                frameworks: [ 'jasmine' ],
                files: [ $srcFiles, $testFiles ],
                reporters: [ 'junit', 'coverage' ],
                junitReporter: {
                  outputFile: $junitResults
                },
                preprocessors: {
                    // source files must be a literal string
                    'helpers/*.js': [ 'coverage' ]
                },
                coverageReporter: {
                    type: 'lcov',
                    dir: $coverageOutputDir
                }
            }
        },

        // export Karma coverage to SonarQube
        karma_sonar: {
            your_target: {
                // properties for SonarQube dashboard
                project: {
                    key: 'net.ahexample:ahexample-jasmine-karma-sonar',
                    name: 'Jasmine with Karma and SonarQube Example',
                    version: '0.0.1'
                }

                // sources property is set at runtime (see below)
            }
        },

        clean: [ $outputDir ]
    });


    /*
     * Task to set karma_sonar's sources property.
     * This is needed because karma (coverage) stores its results in a
     * directory whose name uses the browser's user agent info
     * (name/version and the platform name).
     * The latter may well he different to the OS name and so its needs an
     * OS to platform translator.
     * For example, OS name for Apple Mac OS X is Darwin.
     */
    grunt.registerTask('set-karma-sonar-sources-property', function() {
        var $done = this.async();
        var $phantomjs = require('karma-phantomjs-launcher/node_modules/phantomjs');
        var $spawn = require('child_process').spawn;
        var $phantomUserAgent = $spawn($phantomjs.path,
            // phantomjs script to print user agent string
            [ 'lib/phantomjs-useragent.js' ]
        );

        /*
         * Construct coverage LCOV file path from PhantomJS'
         * user agent string, then use it to set karma_sonar's
         * sources property.
         */
        $phantomUserAgent.stdout.on('data', function(msg) {
            var $useragent = require('karma/node_modules/useragent');
            var $agent = $useragent.parse(msg);
            // An example of dirName is 'PhantomJS 1.9.7 (Mac OS X)'
            var $dirName = $agent.toAgent() + ' (' + $agent.os + ')';
            var $coverageResults = $coverageOutputDir + '/' + $dirName + '/lcov.info';
            var $sonarSources = makeSonarSourceDirs($srcFiles, $coverageResults);
            var $karmaSonarConfig = 'karma_sonar';
            var $ksConfig = grunt.config($karmaSonarConfig);

            grunt.log.writeln('coverage LCOV file: ' + $coverageResults);
            $ksConfig['your_target']['sources'] = $sonarSources;
            grunt.config($karmaSonarConfig, $ksConfig);

        });

        $phantomUserAgent.on('close', function(exitCode) {
            $done();
        });


        /*
         * Create sonar source object for each directory of source file pattern.
         */
        function makeSonarSourceDirs($filesPattern, $coverageResults) {
            var $path = require('path');
            var $dirs = [];

            grunt.file.expand(
                {
                    filter: function($filePath) {
                        $dirs.push({
                            path: $path.dirname($filePath),
                            prefix: '.',    // path prefix in lcov.info
                            coverageReport: $coverageResults,
                            testReport: $junitResults
                        });
                    }
                },
                $filesPattern
            );

            return $dirs;
        }
    });


    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-jasmine');
    grunt.loadNpmTasks('grunt-karma');
    grunt.loadNpmTasks('grunt-karma-sonar');


    grunt.registerTask('test', [ 'jasmine', 'karma:continuous' ]);
    grunt.registerTask('sonar-only', [ 'set-karma-sonar-sources-property', 'karma_sonar' ]);
    grunt.registerTask('sonar', [ 'test', 'sonar-only' ]);
    grunt.registerTask('default', 'test');
}

感谢您的关注。


How

这取决于:

  1. 如果您有一些应用程序代码需要针对浏览器进行测试(例如Angular, Backbone等) - 使用Karma并且不要使用require。然后只需确保您的helpers.js文件在测试之前加载。

    // @file Gruntfile.js
    // https://github.com/karma-runner/grunt-karma
    grunt.initConfig({        
      karma: {
        client: {
          options: {
            files: ['client/*.js', 'helpers/*.js', 'test/*.js']
          }
        }
      }
    });
    
    // @file helpers.js
    (function () {
      window.helpers = {
        foo: function () {
          return 'bar';
        }
      };
    })();
    
    // @file spec.js
    (function (helpers) {
    
      it('does the thing', function () {
        expect(helpers.foo()).toBe('bar');
      });
    
    })(window.helpers);
    
  2. 如果您不需要针对浏览器运行测试(即您正在严格测试NodeJS代码),您可以通过删除来简化您的设置Karma并严格使用Jasmine:

    // @file Gruntfile.js
    // https://github.com/gruntjs/grunt-contrib-jasmine
    grunt.initConfig({
      jasmine: {
        server: {
          src: 'server/*.js',
          options: {
            specs: 'test/*.js',
            helpers: 'helpers/*.js'
          }
        } 
      }
    });
    
    // @file helpers.js
    (function () {
      module.exports = {
        foo: function () {
          return 'bar';
        }
      };
    })();
    
    // @file spec.js
    (function () {
      var helpers = require('helpers'); // require is available
    
      it('does the thing', function () {
        expect(helpers.foo()).toBe('bar');
      });
    
    })();
    

Why

require不存在,因为您正在使用Karma运行您的测试。Karma只需在您选择的浏览器中加载文件并按照您在文件中提供的顺序执行它们karma.conf.js。它在内部使用您提供的测试框架(在本例中Jasmine)针对您提供的浏览器运行测试(在本例中PhantomJS).

与所有 JavaScript 一样,变量上下文是由它所在的闭包定义的。

  • The Jasmine二进制内部使用NodeJS, which 模拟 CommonJS 要求 https://github.com/nodejs/node/blob/6fff47ffacfe663efeb0d31ebd700a65bf5521ba/deps/v8/test/promises-aplus/lib/require.js,使得require您可以在节点应用程序的上下文中使用该函数。

  • The Karma跑步者所做的相当于写作<script src="[path]">标签到浏览器,然后每个浏览器加载相应的文件到PhantomJs。因此,您的 javascript 上下文是全局的,并且您的文件只能访问全局上下文。在浏览器中,全局上下文是由附加到浏览器的所有内容定义的window对象,以及window.require本身并不存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在规范中使用 require - 节点中的 grunt + karma + jasmine 的相关文章

随机推荐

  • 为什么FocusNode需要在flutter中进行处置?

    我有点很困惑何时使用dispose扑腾中 有关于这方面的好的教程吗 在食谱中https flutter io docs cookbook forms focus https flutter io docs cookbook forms fo
  • 在 Android 中将视频流传输到网络

    我想制作一个可以将视频流传输到网络的 Android 应用程序 我知道如何在 Android 中录制视频 但不知道如何将其流式传输到网络 我不想将此视频存储到手机的 SD 卡上 但我希望将其存储在网络上 为此 我计划使用 ASP NET W
  • AWS ECS:运行任务失败原因:[“ATTRIBUTE”]

    当尝试在 EC2 实例中运行任务时 我收到了这条可怕的错误消息 Run tasks failed Reasons ATTRIBUTE 和其他许多人一样 https stackoverflow com questions 45173637 u
  • 如何防止在未插入行时触发插入触发器?

    我有一个表1 在此表上我创建了一个触发器 插入或更新或删除之后 现在 如果我执行一个不插入任何内容的插入 触发器仍然会被触发 insert into TABLE1 select from TABLE1 where 1 0 该查询不会插入任何
  • IObservable 按下的按键

    所以我可以尝试反应式扩展 我想创建一个用户按下的按键的 IObservable 我怎样才能做到这一点 这是一个 C 控制台应用程序 尝试这样做来获取可观察的读取键序列 IObservable
  • 如何使用 C# .NET CORE 2.0 将 FIX 登录消息发送到 GDAX

    我正在尝试建立一个到 fix gdax com 的 FIX 4 2 会话 文档 https docs gdax com fix api https docs gdax com fix api 使用 C 和 Net Core 2 0 当我尝试
  • .NET 内部编码

    NET 应用程序的内部编码是什么 例如字符串对象 我可以定义我的应用程序应使用什么编码吗 如果我将 net 字符串写入文件 字符串是什么编码 edit Dim test as String Das ist ein Test lt what
  • Amazon S3 预签名 url - 手动或一次性上传无效

    我正在使用 S3 接受用户到 S3 的直接上传 因此我将使用预签名的网址 上传成功后 AWS Lambda会确保上传的文件是图像 然后客户端会告诉我的服务器他已经完成上传 然后我的服务器将检查该文件是否存在于 S3 中 如果 Lambda
  • 为什么pygame中的文字显示2秒

    我显示的文本仅显示约 2 秒 我希望当我点击其他区域时它会显示 elif msg 0 7 YOU WIN and Message id 200 print You Win textSurface font render You Win Tr
  • Rails - 回形针 - 多张照片上传不保存

    我正在尝试在 Rails 中创建一个创建产品页面 这包括添加多个图像和文本字段 我有一种产品模型和一种照片模型 我正在使用回形针宝石来上传照片 但当我查看产品页面时 我没有看到任何图片 照片未保存到数据库中 附 我使用 HAML 应用程序
  • 为什么 `id id` 不是 OCaml 中的值?

    我仍在尝试理解 OCaml 中的值限制 并且我正在通读赖特的论文 https cs au dk hosc local LaSC 8 4 pp343 355 pdf 其中指出 fun x gt x fun y gt y 不是一个语法值 同时它
  • Google Apps 表单脚本中的动态选择选项

    I have 这个表格 https docs google com forms d 1wVvo rabq xxXTnWVRDBIwmRCKOA09QAtbNfbRWEG6Y viewform 如果您看到列表项目 学生姓名和成绩正在从 Goo
  • React-virtualized InfiniteLoader/List - 使用 AJAX 的工作示例

    我正在做一个 React Redux 项目 需要实现一个虚拟化 无限加载列表 react virtualized似乎打算完成这项工作 但即使在阅读了所有可用文档并阅读了许多 StackOverflow 帖子之后 我仍无法使其工作或找到有关组
  • 如何计算两个字符串共有的字符数?

    如何计算两个字符串之间的字符交集 例如 假设我们有一个名为String intersection abc intersection ab 2 hello intersection hallo 4 好的 孩子们 感谢你们的大量反馈 更多示例
  • Windows驱动程序内核:如何枚举所有子目录和文件?

    我正在一个小型 antirootkit 中工作 我需要添加一个功能 删除 rootkit 目录和您可能的子目录中的所有文件 那么 首先有必要知道所有这些目录和文件 对吗 为此 我下面的代码已经完成了这项任务的一半 他枚举特定目录的所有目录和
  • Mongodb基于unix时间戳按天聚合

    我用谷歌搜索了很多 但没有找到任何有用的解决方案 我想找到每日用户总数 我有一个名为会话日志有如下文件 id ObjectId 52c690955d3cdd831504ce30 SORTID NumberLong 1388744853 PL
  • 是否有一种编程语言具有完整且正确的 Unicode 支持?

    大多数编程语言都有some支持 Unicode 但都有一些或多或少记录在案的极端情况 在这些情况下 事情将无法正常工作 Examples Java StringBuilder StringBuffer中的reverse 工作正常 但是 St
  • R 中矩阵的最大大小

    我正在使用 igraph 进行一些网络分析 作为其中的一部分 我必须创建一个包含 2 列和与链接数量相同的行的矩阵 我有一个大型网络 数百万个链接 并且在运行 3 小时后创建此矩阵不起作用 没有错误 只是没有结果 并且显示 未响应 这样的字
  • 使用 Chart.js 在一页中显示多个图表

    我使用 Chart js 及其依赖项 jQuery 来绘制图表 就我而言 我的页面之一需要 2 个圆环图 这是我的代码
  • 如何在规范中使用 require - 节点中的 grunt + karma + jasmine

    模糊版本问题 如何在 grunt 规范中使用 require Context 我正在开发一个尚未测试的现有节点项目 所以我阅读了一些内容并意识到使用 karma 和 jasmine 我读了一些教程 包括这些 http kwilson me