問題タブ [gpars]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
grails - Groovy Actor の奇妙な動作
私はこのコードを持っています:
私は次のように始めます:
問題は、タスクがランダムな順序で実行されることです。git clone
repos.size() と同じ回数だけコマンドを実行する必要がありますが、そうではありません。毎回ランダムな回数実行されます。
そのeach
ループは単一のタスクとしてバックグラウンドで実行する必要があり、git clone
コマンドは並行して実行されるようです。
groovy - GPars 並列書き込み、すべてのファイルが書き込まれるのはいつですか?
したがって、次のようなブロックがある場合:
すべてのファイルが書き込まれ、フラッシュされ、追加のコードで使用できるようになるのはどの時点ですか? End of eachParallel
またはでEnd of withpool
?...または、これを管理するために特別なコードが必要ですか?
groovy - GPars は Groovy の一部ですが、API ドキュメントにはありませんか? インポートできないのはなぜですか?
http://www.gpars.org/guide/guide/gettingStarted.html#gettingStarted_downloadingAndInstalling
GPars が Groovy に組み込まれたと書かれています。もしそうなら、Groovy の API ドキュメントで見つけられないのはなぜですか? import ステートメントが機能していないように見えるのはなぜですか? Groovy ディストリビューションにライブラリが表示されます。
asynchronous - GPars を使用して非同期タスクをディスパッチし、すぐに戻る
非同期タスクをディスパッチし、すぐに戻るメソッドが必要です。結果を待つ必要はありません。私はこのようなものを動作させたい:
上記の状況では、 .get() の呼び出しがないため、タスクは実行されませんが、 .get() を実行すると、メソッドはタスクが終了するまで jobId を返しません。
タスクをディスパッチしてすぐに戻るにはどうすればよいですか?
unit-testing - Spock モックは、gpars のアクティブ オブジェクト メソッドで呼び出されたときに呼び出されないようです。
私のコードには 2 つのクラスがあります。1 つは DynamicRule と呼ばれるもので、もう 1 つはルール インスタンスに GPARS activeObject ラッパーを提供する AORule と呼ばれるラッパーです。
DynamicRule はこれに少し似ています - dynamicExecute と呼ばれるメソッドを使用します
GPARS activeObject を使用してDynamicRule rule
参照の状態を管理するこの AORule のラッパー クラスがあります。execute()
メソッドは非同期の activeObject メソッドを呼び出して、内部rule
参照でアクションをトリガーします。
これが自分自身で機能していることを示すために、いくつかのテストを作成しようとしましたが、失敗しました。mockres
私は 2 つの簡単なテストを実行しようとしましたが、1 つは dynamicRule 自体で機能します。期待値を設定し、モックにクロージャーを呼び出して変数に対するそのクロージャーの副作用をテストするように依頼します。すべて期待どおりに機能します。
2 番目のテストでは、モックをセットアップして aorule.rule インスタンスに設定し、モックの期待値を設定し、アクティブなメソッドaorule.execute()
を呼び出すメソッドを呼び出し、それが私のモックを呼び出しますactiveExecute()
これは失敗します - モックでクロージャーが実行されず、 then: アサーション テストが失敗する理由。
ここに出力トレースの一部を含めました - これがaorule.execute()
activeObject メソッドをトリガーすることactiveExec : rule dump looks like
がわかります。 of val など)、スタブ クロージャは呼び出されず、mockres は設定されません - テストは失敗します
私はこれをトレースしようとしているか、デバッガーで監視しようとしましたが、役に立ちませんでした。スタブのクロージャがトリガーされません - テストが失敗します。
デバッガーでもう一度見ようとしたところ、行を過ぎたときに
デバッガーはInternalActor.handleCurrentMessage()
、GPAR のどこかでエラー ハンドラーにジャンプします。これを変更しても違いはありません
私はこれを理解していません。おそらく私は何かばかげたことをしていますが、@ActiveMethod - activeExecute()
モックを使用してコードをテストするためのテストを書くことができません (手作りのクラスなどを介してこれを実行しようとしましたが、シミュレートされたテストを機能させることができません.
テストを正しく修正して実行するにはどうすればよいですか? 私が知る限り-スクリプトでコードを実行すると(「ライブ」テスト)、コードはやりたいことを実行しているように見えますが、それを示すための単体テストを作成することはできません
追記: ActiveMethod のラッピングに関係しています - よくわかりません
次のようにテスト スクリプトに 2 つのダミー ラッパー クラスを作成しましたdynamicExecute()
。AOWrappersは@ActiveMethod
同じスクリプト ファイル内の 2 つのテストは次のようになります
テストを実行すると、最初のテストは問題なく成功し、2 番目のテストは失敗し、myclos
は呼び出されません。次に何を試せばいいですか?
質問への説明
私はこれを 1 つのグルーヴィーなテスト ファイルにまとめてみました。
注意すべき重要な点は、最後のテストです。Mock でクロージャーの出力を実行するという期待を設定しました。これによりmockres
変数が更新され、then: 句で設定されていると断言できます。
テストを呼び出すと、@ActiveMethod execute()
このように失敗します
これは、モックレスがクロージャー呼び出しによって設定されなかったことを示しています。
次の aowrule.exec() 行のコメントを外すexec()
と、ActiveMethod が使用する非表示のアクターを使用せずに、委任された呼び出しが直接呼び出されます。その次の行を実行すると、クロージャーが正しく呼び出され、モックが設定されます。
したがって、問題には、その背後にある隠れたアクターを介してこれを行うときにモックが機能することをテストしようとする何かがあり@ActiveMothod
ます。
実際には、スクリプトとして実行するだけでコードが期待どおりに機能していると思います(コードでの実際の使用)。ただし、ActiveMethod が呼び出されたときに期待される動作を証明するテストを作成できないようです。
GPAR のような非同期コードのモックを使用してスポック テストを作成するには、何か賢いことをしなければならないのでしょうか。