6

HTML カバレッジ レポートを生成しようとしていますが、期待する出力が含まれていません。たぶん私はここで間違っているかもしれませんが、スペックファイルから呼び出された行とメソッドだけを表示する必要がありますよね?

どういうわけかそうではありません。

アップデート:

問題の概要を説明する実際の例を提供するリポジトリを作成しました。

https://github.com/gearsdigital/stunning-octo-train

これは私の(テスト)プロジェクトのセットアップです。このコードを実行するために JSFiddle をセットアップする方法がわからないため、必要に応じて GitHub リポジトリにプッシュできます。

TL;DR

HTML カバレッジ レポートを生成するプロセスがあります。このレポートは、カバーされているコードを示していますが、利用可能なテストがないため明らかにカバーされていません。

カルマ.conf.js:

var webpack = require('webpack');
var path = require('path');

// Reference webpack.config.js, don't repeat it!
var webpackConfig = require('./webpack.config.js');

// The entry point from the referenced Webpack configuration has to be
// removed or tests will fail in weird and inscrutable ways.
// Easy enough, just define an empty entry object (null won't work).
webpackConfig.entry = {};
webpackConfig.module = {
    preLoaders: [
        {
            test: /\.js$/,
            // files within these directories should be excluded
            // for babel processing
            exclude: /(node_modules)/,
            loaders: ['babel?cacheDirectory']
        },
        {
            test: /\.js$/,
            include: /(src\/js)/,
            exclude: /(vendor)/,
            loaders: ['isparta']
        }
    ]
};

/**
 * Karma configuration
 * @param config
 */
module.exports = function (config) {
    config.set({
        browsers: ['PhantomJS'],
        coverageReporter: {
            dir: 'test-results',
            reporters: [
                {type: 'text-summary'},
                {type: 'html', subdir: 'coverage'}
            ]
        },
        files: [
            'webpack.test.config.js'
        ],
        frameworks: [
            'jasmine'
        ],
        preprocessors: {
            'webpack.test.config.js': ['webpack']
        },
        reporters: ['spec', 'coverage'],
        webpack: webpackConfig
    });
};

webpack.config.js:

var webpack = require('webpack');
var path = require('path');

module.exports = {
    plugins: [
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            "window.jQuery": "jquery"
        })
    ]
};

webpack.test.config.js:

// make sure the file name regexp matches your test files.
var testsContext = require.context('./tests', true, /\.spec\.js$/);
testsContext.keys().forEach(testsContext);

// make sure the file name regexp matches your test files.
var srcContext = require.context('./src/js', true, /\.js$/);
srcContext.keys().forEach(srcContext);

ブートストラップ.js:

import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3

電卓.js:

export class Calculator {
    add(op1, op2) {
        return op1 + op2;
    }

    sub(op1, op2) {
        if (typeof op1 !== 'number') {
            return false;
        }
        return op1 - op2;
    }

    mul(op1, op2) {
        return op1 * op2;
    }

    div(op1, op2) {
        return op1 / op2;
    }
}

ブートストラップ.spec.js:

import {Calculator} from '../src/js/modules/Calculator';

describe('Calculator', function () {

    it('should return 10', function () {
        expect(true).toBe(false);
    });

});

生成されたレポート:

どのテストでも呼び出さadd()れるのではなく、bootstrap.js.

取材レポート

プロジェクトの構造:

プロジェクトツリー

4

2 に答える 2

6

src/js/bootstrap.jsロードされます。つまり、これらの行が実行されます。

import {Calculator} from './modules/Calculator';
let c = new Calculator();
c.add(1,2); // 3

このブロックが原因だと思います:

    {
        test: /\.js$/,
        include: /(src\/js)/,
        exclude: /(vendor)/,
        loaders: ['isparta']
    }

私のコードはテスト中にのみ実行されるべきではありませんか?

短い答えはノーです。

モジュールをインポートすると、クロージャー/関数/メソッド内にないものはすべてカバーされる可能性があります。

// this will get coverage; because it is top-level code outside a function block
var dummy = null;

export class Calculator {
    add(op1, op2) {
        // this will get coverage only if you call explicitly the function.
        return op1 + op2;
    }
}

// this will get coverage.
var c = new Calculator();
// and now, Calculator.add will get coverage.
c.add(1,2); // 3
于 2015-12-22T07:10:46.167 に答える
4

さて、私は Webpack や Babel に精通していませんが、すべてのファイルを Karma 構成に含めているため、テストの内容に関係なくコードが実行されるのではないかと強く疑っています。私はあなたの GitHub の例をチェックアウトしました (これを実行したことを称賛します。デバッグが簡単ですcart.js) utilities.js

簡単に言うと、関数にカプセル化されていないコードは、ファイルを Karma に含めることで実行されます。また、テストがまったくない場合 (文字通り 0 などit)、カルマを信頼しないでください。この特定のケースでは信頼できません。

于 2015-12-18T12:08:59.890 に答える