【问题标题】:How do I use a Chai plugin like chai-date-string with Karma/Mocha/Chai?如何在 Karma/Mocha/Chai 中使用像 chai-date-string 这样的 Chai 插件?
【发布时间】:2017-10-03 10:06:41
【问题描述】:

应该能够使用任何带有 Karma/Mocha 和 Chai 单元测试的 Chai 插件,还是需要将其转换为特殊的 karma 兼容插件?

我想使用chai-date-string 来执行expect(requestBody.time).to.be.a.dateString(); 之类的操作,但只是将它们安装为 NPM 模块并在我的测试文件中要求它们时运气不佳。

然后我遇到了karma-chai-plugins,我认为它旨在使用其他 chai 插件(甚至超出它捆绑的少数插件),但将其添加为 NPM 模块,然后将 Chai 插件名称添加到框架列表,但这不起作用。

我的karma.conf.js

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['mocha', 'chai', 'chai-date-string', 'sinon-chai', 'browserify'],
    client: { chai: { includeStack: true } },
    files: [ 'playmob.js', 'test/**/*_test.js' ],
    preprocessors: {
      'test/**/*.js': [ 'browserify' ]
    },
    browserify: {
      debug: true,
    },
    exclude: [ ],
    reporters: ['mocha', 'beep'],
    mochaReporter: { ignoreSkipped: true },
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadless'],
    singleRun: false,
    concurrency: Infinity
  })
}

package.json 中的版本(我必须显式安装更新版本的chai-as-promised 才能解决依赖问题):

  "devDependencies": {
    "browserify": "^14.4.0",
    "chai": "^4.1.2",
    "chai-as-promised": "^7.1.1",
    "chai-date-string": "^0.1.0",
    "karma": "^1.7.1",
    "karma-beep-reporter": "^0.1.4",
    "karma-browserify": "^5.1.1",
    "karma-chai-plugins": "^0.9.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-cli": "^1.0.1",
    "karma-mocha": "^1.3.0",
    "karma-mocha-reporter": "^2.2.4",
    "karma-sinon-chai": "^1.3.2",
    "mocha": "^3.5.3",
    "sinon": "^2.4.1",
    "sinon-chai": "^2.14.0",
    "uglifyjs": "^2.4.11",
    "url": "^0.11.0",
    "watchify": "^3.9.0"
  }

导致以下错误:

> playmobjs@0.2.0 test /Users/jschuur/Code/Playmob/js_api_lib
> karma start

/Users/jschuur/Code/Playmob/js_api_lib/node_modules/di/lib/injector.js:9
      throw error('No provider for "' + name + '"!');
      ^

Error: No provider for "framework:chai-date-string"! (Resolving: framework:chai-date-string)
    at error (/Users/jschuur/Code/Playmob/js_api_lib/node_modules/di/lib/injector.js:22:12)

【问题讨论】:

    标签: unit-testing karma-runner chai


    【解决方案1】:

    当我查看karma-chai-plugins 的代码时,我看到了一系列hardcoded plugin names。在我看来,karma-chai-plugins 只识别那些在其源代码中硬编码的 Chai 插件。所以我认为你不能将它用于chai-date-string

    此外,chai-date-string 并非以易于在浏览器中加载的格式分发。您可以使用 Browserify 或 Webpack 将其转换为将 chaiDateString 之类的文件导出到全局空间的文件。然后你必须:

    1. 将转换后的chai-date-string 脚本包含在files 中。

    2. files 中添加另一个调用chai.use(chaiDateString) 的脚本。代码库中显示的example code 省略了对chai.use 的调用,但不能省略。

    【讨论】:

    • 我的设置已经使用了 browserify,事实上,我在另一个测试中使用了 url 模块,而没有在 karma.conf.js 的某个地方设置它,所以我不确定更多的设置会被需要。我确实查看了您的建议并尝试将chai.use(chaiDateString); 添加到我的playmob_test.js 文件的顶部,以及在我的files 块中包含node_modules/chai-date-string/index.js 的一些变体,但没有运气。我仍然遇到同样的错误。
    • 如果您收到 same 错误,那是因为您仍在 frameworks 设置中使用 chai-date-string。您必须从那里删除它。 (我的第一段暗示了这一点,因为唯一允许它在frameworks 中是karma-chai-plugins 但你不能使用它。)是的,我看到你正在使用browserify。我猜你可以使用你已经拥有的配置如果你在你的测试文件中使用var chaiDateString = require("chai-date-string")并将chai.use(chaiDateString)放在每个测试文件中。
    • 但是,如果您希望一劳永逸地设置chai-date-string,而不必在所有测试文件中设置require,您不能依赖karma.conf.js 中的Browserify 配置。您需要将chai-date-string 与您的测试文件分开处理。我没有在 Karma 中使用 Browserify,所以我不知道您是否可以在 karma.conf.js 中为此执行必要的配置。
    • 我在评论后又做了一些实验,发现你说的:只要我添加了chai.use(chaiDateString),它就可以正常工作,karma.conf.js 中没有任何特殊引用。事实证明这比我想象的要容易!谢谢你推我过线。我的理解是在某些时候所有以karma- 开头的模块都会自动加载,所以我什至不需要将它放在frameworks 块中。问题解决了!
    • 最后澄清一下:如果您只是以这种方式使用 chai 插件,那么您根本不需要 karma-chai-plugins
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2021-02-14
    • 1970-01-01
    • 2015-06-02
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多