私は、より高速なサーバー ビルドで失敗し始めている、継承されたフレックスユニット テストを処理する方法に取り組んできました。単体テストの実行が開始される前に MyMockService が準備されていません。FlexUnit と Mockolate を使用しています。
<failure
message="A proxy for com.something.somemock.service::MyMockService has not been prepared yet"
type="com.something.somemock.MyAsyncTest">ArgumentError: A proxy for com.something.somemock.service::MyMockService has not been prepared yet.
//... (lots removed here)
</failure>
使用されている汎用インポート:
import flash.events.Event;
import flexunit.framework.Assert;
import mockolate.nice;
import mockolate.prepare;
import mockolate.stub;
import mockolate.verify;
import org.flexunit.async.Async;
import flash.utils.Timer;
import flash.events.TimerEvent;
これがコードのスタブです。(と思う)重要な部分がそこにあるので、要点がわかります。
public class MyAsyncTest
{
[Before(async)]
public function prepareMockObjects():void
{
Async.proceedOnEvent(this, prepare(MyMockService), Event.COMPLETE);
}
[Test(async)]
public function testExecute():void
{
var service:MyMockService = nice(MyMockService);
verify(service).method("runSomething").args(ArgumentBuilder).once();
}
}
タイムアウトを変更し、スリープ メソッドを追加するという多くの作業を行った後 (すべてエラーとの戦いには役に立ちません)、遅延のみを含むフレックスユニット テスト クラスにもう 1 つのテストを導入しました。テストを注文しましたが、毎回テストに合格するようになりました。(これは良いことです) 終了準備に必要な 3 秒の遅延を得るために、テストを入れるのが本当に嫌いです。
ビジュアルのコード スタブは次のとおりです。
public class MyAsyncTest
{
protected function makeMeSleep(howLongMs:int):void
{
//timer code to sleep
}
[Before(async)]
public function prepareMockObjects():void
{
Async.proceedOnEvent(this, prepare(MyMockService), Event.COMPLETE);
}
[Test(async, order=1)]
public function delayTheNextTest():void
{
var hasPaused:Boolean = makeMeSleep(3000);
Assert.assertTrue("This is a silly delay to allow the service to prepare", true);
}
[Test(async, order=2)]
public function testExecute():void
{
var service:MyMockService = nice(MyMockService);
verify(service).method("runSomething").args(ArgumentBuilder).once();
}
}
テストが正常に構築されたことをうれしく思いますが、汚れているように感じます。[Test] ブロックは [Before] ブロックが終了するまで実行されないというのが私の前提でしたが、このテスト条件ではそうではないようです。皆さんからの重要な意見の 1 つは、このテストが私のモック サービスの準備方法と同じようにスタイルが悪いかどうかであり、時間を稼ぐためだけに「スリープ」テストを追加することを避けるためのより良い方法は何でしょうか? (それ自体が悪いスタイルです)
事前にご入力いただきありがとうございます。