3

そのため、私はjsでのテストに不慣れで、mochaを使用してノードアプリケーションをテストしようとしています。

理想的には、テストが別のファイルにあり、ノードスクリプト自体で実行されるようにしたいです(おそらく、テストスクリプトの先頭にあるrequire呼び出しを使用して)。現時点では、スクリプトファイルの下部にあるブロックにテストを含めるという、正しくないことがわかっていることを行っています。これが本番コードに含まれているテストコードであるという問題と、ノードサーバーを起動しようとしたときに「describeが定義されていません」と返されるという事実。

モカなどのチュートリアルをたくさん読んだので、「module.export。」を実行することですべてのメソッドを個別にエクスポートできるようですが、コストがかかり、煩わしいこともあります。

ここで何が欠けていますか?確かに、2つのスクリプト(1つはテストコードあり、もう1つはテストコードなし)を作成する必要はありません。バージョンの問題が発生します。

これはどのように行うのが最善ですか(記事へのリンクもありがたく受け入れられています。:)

ありがとう

ジェームズ

4

2 に答える 2

4

そこで、私が人々が行っていることと、私が自分の仕事で採用した方法を以下に示します。

  1. モジュールでは、エクスポートする必要がある値のみをエクスポートします。個人的には、1 つの関数のみをエクスポートするように制限しようとしていますが、それは別の議論です。
  2. ディレクトリを作成し、testすべてのテスト ケースをそこに配置します。好きな命名規則を使用してください。ソース モジュールごとに 1 つのテスト ファイルを用意することをお勧めします。各ファイルの先頭で、テスト対象のモジュールを単に require します。
  3. 引数を使用して Makefile/Cakefile から mocha を呼び出して--recursive、ディレクトリの内容全体を調べることを認識しますtest

これは、通常のコードでモジュールを使用するのと同じように、インターフェイスを介してモジュールをテストしていることを意味します。欠点は、モジュールのインターフェースを介してヒットするのが難しい実行パスを持つエクスポートされていない関数がある場合、少しイライラする可能性があることです。

一方では、モジュールは使用時にテストする必要があるという考えに同意します。一方で、前述のトリッキーな実行パスのすべてを直接テストしたことを知っていれば、夜はよく眠れると思います。node.js プログラミングを行う前に、私は数年かけて erlang コードを書きましたが、これは正反対の規則を持っています: (テストはソース ファイルの最後に配置されるため、モジュール内のすべての関数に直接アクセスでき、インクルード/エクスポートをテストします。 ifdef ディレクティブによって処理されます)。個人的には、erlang のアプローチの方が好きです。

とにかく、これがお役に立てば幸いです。これを読んで反対の意見を強くお持ちの方がいらっしゃいましたら、ぜひお聞かせください。

于 2012-10-26T02:51:01.173 に答える
3

David Weldon の投稿には同意しますが、いくつかの例を追加します。

通常どおり Node モジュールを作成する必要があります。コードの他の部分で使用される可能性のある電卓を作成している場合、電卓モジュールは次のようになります。

Calculator = {
  add: function(a, b) {
    return a + b;
  }
};

module.exports = Calculator;

module.exportsあなたは、使用することはコストがかかり、邪魔に見えると述べています。これについてできることがいくつかあります。module.exports別のファイルでコードにアクセスできるようにするための最良かつ推奨される方法です。簡単にするために、電卓で行ったように関数と変数をオブジェクトにラップし、1 つのオブジェクトのみをエクスポートできます。

「エクスポート」を使用するには 2 つの方法があることに注意してください。あなたはこれを行うことができます:

var a = function() { ... };
var b = 10;
var c = null;

exports.a = a;
exports.b = b;
exports.c = c;

exportsモジュールの特別なオブジェクトに何かを追加します。または、これを行うことができます:

objectToExport = {
  a: function() { ... },
  b: 10,
  c: null
};

module.exports = objectToExport;

オブジェクトを置き換えるものexports。そうした場合、それは機能せず、別のファイルでモジュールexports = objectToExportを試みたときに空のオブジェクトになってしまいます。require

testMocha でテストするときは、コード ディレクトリの構造を反映したディレクトリにすべてのテスト ファイルを置きます。

project
  +- lib
   +- calculator.js
  +- test
   +- lib
    +- calculator.js

私のtest/lib/calculator.jsファイルは、lib/calculator.jsファイルのMochaテストです

var Calculator = require('../../lib/calculator.js');
var assert = require('assert');

describe('Calculator', function() {
  describe('add', function() {
    it('should add two numbers', function() {
      var res = Calculator.add(2,2);
      assert.equal(res, 4);
    });
  });
});

デフォルトでは、mocha は/testmocha を実行するディレクトリ内のディレクトリを探します。上記の例のようなサブディレクトリがある場合は--recursive、コマンド ラインに追加して、すべてのテストを見つけることができます。したがって、上記のディレクトリで実行している場合project、コマンドはmocha --recursive.

于 2012-11-02T20:23:44.487 に答える