0

私は JS にステート マシンを持っていますが、これには (簡略化するために) 何かが起こる前にのみ設定される初期状態があります。

define(function() {
  var state = 'initial',
      exports = {};

  exports.getState = function() {
    return state;
  };

  exports.doSomething = function() {
    state = 'newState';
  };

  return exports;
});

アプリがリロードされるまで状態は永続的であるため、最初のテストの後、状態が再び「初期」になることはありません。そのため、状態をリセットする方法が必要です。

これを行う最も汚い方法はどれですか? するべきか...

a) 単純に状態を公開し、_? で非公開としてマークします。

define(function() {
  var exports = {};

  exports._state = 'initial'

  exports.getState = function() {
    return this.state;
  };

  exports.doSomething = function() {
    this.state = 'newState';
  };

  return exports;
});

b) 関数を介して状態を書き込み可能にしますか?

define(function() {
  var state = 'initial',
      exports = {};

  exports.getState = function() {
    return state;
  };

  exports.doSomething = function() {
    state = 'newState';
  };

  if(window.xxTests) {
    window.xxTests.Module = {
      setState: function(newState) {
        state = newState;
      }
    };
  }

  return exports;
});

(ここで、xx はアプリのプレフィックスであり、xxTests はテスト ランナーの一部としてのみ定義されています)

また

c) 私が考えもしなかった別のことをする?

ご意見やご提案をお待ちしております。

4

2 に答える 2

0

テストの実行方法に関するコンテキストはあまりありません。

ほとんどのテスト ランナーには、その名前が示すように実行されるセットアップとティアダウンに使用できるbeforeEach()beforeAll()afterEach()、およびメソッドがあります。afterAll()

特定の問題を解決するために、「ステートマシン」コードを変更しませんが、代わりにbeforeEach()関数に新しいステートマシンを作成して、各テストが状態が「初期」に設定された新しい関数オブジェクトを取得するようにします。

于 2015-05-29T23:34:47.343 に答える
0

一般的な回答:プライベート データを公開せずにコンポーネントをテストするより良い方法は、そのコンポーネント内にテスト コードを配置することです。もちろん、あなたの言語がこれをクリーンな方法でサポートしていない場合 (D のように)、これは非常に汚いものになります。

あなたの場合、明示的に必要とされない限り(テスト中のみ)プライベートデータを公開しないため、2番目の方法(オプションbを意味します)をお勧めします:

if(youAreDoingATest)
{
    exports.reset=function() { state='initial'; };
}
于 2013-05-08T16:42:26.237 に答える