5

テストを Karma で実行できるように近づいていますが、最後のステップ (と思います) が不足しており、chai-jquery動作するようになりました。2 つの異なるプラグインを試しましたhttps://www.npmjs.com/package/karma- chai-jqueryおよびhttps://www.npmjs.com/package/karma-jquery-chaiは、さまざまな github の問題または readme ファイルで設定された指定された順序に従った後でも、成功しませんでした。

これは私のtests-main.jsファイルです

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

Object.keys(window.__karma__.files).forEach(function(file) {
    if (TEST_REGEXP.test(file)) {
        // Normalize paths to RequireJS module names.
        allTestFiles.push(file);
    }
});

require.config({

    baseUrl: '/base',

    paths: {
        'chai':             'node_modules/chai/chai',
        'chai-jquery':      'node_modules/chai-jquery/chai-jquery',
        'jquery':           '//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery',
        'underscore':       '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min',
        'sn/sn-underscore': 'static/scripts/sn/sn-underscore',
        'vendor/jquery-ui': '//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min'
    },

    deps: allTestFiles,

    callback: window.__karma__.start
});

これは私のものですkarma.conf.js(重要でないオプションまたはデフォルトのオプションをすべて削除しました)

// Karma configuration
module.exports = function(config) {
    config.set({
        basePath: '',
        // Can't use chai in here for whatever reason
        frameworks: ['mocha', 'requirejs'],
        files: [
            'static/scripts-test/test-main.js',
            {pattern: 'node_modules/chai/chai.js', included: true},
            {pattern: 'static/scripts-test/**/*.js', included: false},
            {pattern: 'static/scripts/sn/**/*.js', included: false}
        ],
        exclude: [
            'static/scripts/global.js'
        ],
        browsers: ['PhantomJS']
    });
};

これは「機能する」仕様ファイルです。gets と への参照を正しく使用していますがchaijqueryロードchai-jqueryは毎回失敗します。

define([
    'chai',
    'jquery',
    'static/scripts/sn/widgets/dismissable'
], function(chai, $) {
    chai.should();
    chai.expect();

    describe('Dismissable', function() {
        var $el = $('</p>'),
            closeBtnSel = '.js-dismissable-close-btn';

        beforeEach(function() {
            $('body').append('<div id="fixtures"></div>');
            $el.appendTo('#fixtures').dismissable({closeFn: 'hide'});
        });

        afterEach(function() {
            $el.remove();
        });

        it('should correctly create the HTML', function() {
            $(closeBtnSel).should.exist;
            $el.should.have.class('dismissable');
        });
    });
});

私が得るエラーは次のとおりです。

TypeError: 'undefined' is not an object (evaluating '$(closeBtnSel).should.exist')

これは私のディレクトリ構造です:

- static/
  - scripts/
  - scripts-test/
    - test-main.js
- node_modules/
- karma.conf.js

そして最後に、私のpackage.json

{
  "devDependencies": {
    "chai": "^2.3.0",
    "chai-jquery": "^2.0.0",
    "jquery": "^2.1.4",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^0.1.10",
    "karma-requirejs": "*",
    "mocha": "^2.2.5",
    "requirejs": "^2.1.18",
    "should": "^6.0.1"
  }
}

私が通常得るエラーのいくつか:

でフレームワークの順序を変更する場合karma.conf

    throw error('No provider for "' + name + '"!');
                ^
    Error: No provider for "framework:chai"! (Resolving: framework:chai)

プラグインをインストールしても

時々私はこのようなものを得るでしょう:

Error: Mismatched anonymous define() module: function ($) {
        return function (chai, utils) {
          return chaiJquery(chai, utils, $);
        };
      }

ここで何か助けていただければ幸いです。これについて頭を悩ませることはできません。

編集: Louis からの推奨に基づく小さな変更

4

1 に答える 1

4

「すべき」API をインストールするにchai.should()は、関数を呼び出す必要があります。この行var should = chai.shouldは何も役に立ちません。

shouldあなたの問題が一連の問題を引き起こしているのか、それとも何か他のことが起こっているのか、最初ははっきりしませんでした. もう一度見てみると、実際にはもっと多くの問題があることがわかりました。

CDN からの RequireJS の読み込み + Karma

Karma にバグがあるようです。まだ開いているこの問題を参照してください。クローズされているが参考になる問題もあります。そのため、CDN をローカル コピーに置き換えました。そうでなければ、私は得る:

ERROR: There is no timestamp for //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js!

チャイ

chai1 つの問題は、script要素を使用してロードするか、RequireJS を使用してロードするかを決定する必要があることです。質問のコードは両方を実行しようとするため、問題が発生する可能性があります。RequireJS でロードすることにしました。これは、 が必要であることを意味しますincluded: false

chai-jquery

テスト ファイルが読み込まchai-jqueryれておらず、使用を求めchaiられていません。したがって、コードに関する限り、存在しません。報告された断続的な読み込みの問題は、他のテスト ファイルのコードが原因である可能性があります。require.config呼び出しにはがdeps: allTestFilesありますが、これは順序を指定していません。RequireJS はallTestFiles、必要な順序でファイルを自由にロードできます。

質問に投稿したコードを例の基礎として取り上げました。明らかに、私はあなたがあなたの側に持っているすべてのコードを持っているわけではありません.

これが新しいものkarma.conf.jsです:

module.exports = function(config) {
    config.set({
        basePath: '',
        frameworks: ['mocha', 'requirejs'],
        files: [
            'static/scripts-test/test-main.js',
            {pattern: 'node_modules/chai/chai.js', included: false},
            {pattern: 'node_modules/jquery/dist/jquery.min.js',
             included: false},
            {pattern: 'node_modules/chai-jquery/chai-jquery.js',
             included: false},
            {pattern: 'static/scripts-test/**/*.js', included: false},
            {pattern: 'static/scripts/sn/**/*.js', included: false}
        ],
        exclude: [
            'static/scripts/global.js'
        ],
        browsers: ['PhantomJS']
    });
};

static/scripts-test/test-main.jsjQuery をローカルにロードする新しいもの:

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

Object.keys(window.__karma__.files).forEach(function(file) {
    if (TEST_REGEXP.test(file)) {
        // Normalize paths to RequireJS module names.
        allTestFiles.push(file);
    }
});

require.config({

    baseUrl: '/base',

    paths: {
        'chai':             'node_modules/chai/chai',
        'chai-jquery':      'node_modules/chai-jquery/chai-jquery',
        'jquery':           'node_modules/jquery/dist/jquery.min',
        'underscore':       '//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min',
        'sn/sn-underscore': 'static/scripts/sn/sn-underscore',
        'vendor/jquery-ui': '//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min'
    },

    deps: allTestFiles,

    callback: window.__karma__.start
});

という名前の正しいテスト ファイル。次static/scripts-test/foo.spec.jsの使用に注意してくださいchai.use(chai_jquery)

define([
    'chai',
    'jquery',
    'chai-jquery',
], function(chai, $, chai_jquery) {
    chai.should();
    chai.use(chai_jquery);

    describe('example', function() {
        it('body should exist', function() {
            $(document.body).should.exist;
        });

        it('#blah should not exist', function() {
            $("#blah").should.not.exist;
        });
    });
});

上記のコードは問題なく実行されます。

WARN [watcher]: Pattern "/tmp/t5/static/scripts/sn/**/*.js" does not match any file.
INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 43.0.2357 (Linux 0.0.0)]: Connected on socket Za9vBp9shDedsIhcNn63 with id 48683492
Chrome 43.0.2357 (Linux 0.0.0): Executed 2 of 2 SUCCESS (0.005 secs / 0.002 secs)

私はブラウザとして Chrome を使用していますが、それが唯一の違いです。

于 2015-06-25T10:54:08.823 に答える