1

私は、より高速なサーバー ビルドで失敗し始めている、継承されたフレックスユニット テストを処理する方法に取り組んできました。単体テストの実行が開始される前に 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 つは、このテストが私のモック サービスの準備方法と同じようにスタイルが悪いかどうかであり、時間を稼ぐためだけに「スリープ」テストを追加することを避けるためのより良い方法は何でしょうか? (それ自体が悪いスタイルです)

事前にご入力いただきありがとうございます。

4

1 に答える 1

1

私はMockolateで同様の問題に遭遇しました.Drewによる回答を読んだことを覚えているようです。

非同期テストではルールが信頼できることがわかりました。ルールを使用すると、コードが読みやすくなります。MockolateRule と目的のモック オブジェクトの両方をメンバー変数として宣言するだけです (メタデータが正しく取得されるようにパブリックである必要があり、ルールをインスタンス化する必要がありますmock()) nice()

[Rule]
public var myRule:MockolateRule = new MockolateRule();

[Mock]
public var myService:MyService;

[Before]
public function setUp():void {
    myService = mock(MyService);
}

[Test]
public function test():void {
    assertNotNull(myService);
}
于 2013-07-11T20:13:33.590 に答える