2011-07-31 7 views
2

Azure Toolkitを使用してWindows Phone 7アプリケーションを作成しています。私はNUnit Test Runner for WP7を使ってユニットテストを作成します。TableServiceContext.BeginSaveChangesを使用してSilverlight単体テストを作成する方法は?

ここで、TableServiceContext.BeginSaveChangesメソッドを使用してデータを空白のテーブルに保存するコードをテストします(利用可能な同期SaveChangesメソッドはありません)。

私はBeginSaveChangesを呼び出すと、それはこのように、同じ試験方法で終了するまで待機する必要が

: 5秒間のタイムアウトが満了しているだけ戻り、後にのみ)

[Test] 
public void MyTest() 
{ 
    ICloudClientFactory factory = new CloudClientFactory(); 
    ITableServiceContext context = factory.ResolveTableServiceContext("MyTable"); 
    // add some entries here 
    UpdateContext(context); 

    AutoResetEvent autoResetEvent = new AutoResentEvent(false); 
    context.BeginSaveChanges((IAsyncResult result) => 
    { 
     context.EndSaveChanges(result); 
     autoResetEvent.Set(); 
    }, null); 

    bool set = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5)); 

    if (set) 
    { 
     Assert.Pass(); 
    } 
    else 
    { 
     Assert.Fail(); 
    } 
} 

autoResetEvent.WaitOne( context.BeginSaveChangesの非同期コールバックが呼び出されました。 なぜですか?

私も(ThreadPool.QueueUserWorkItem方法を使用して)のThreadPoolからスレッド上context.BeginSaveChangesを呼び出してみました - しかし、それは助けにはなりませんでした。

この現象は、Windows Phone 7/Silverlightと関係がありますか?

ありがとう!

答えて

0

ICloudClientFactoryとITableServiceContextの両方がインターフェイスです。実際のAzureクラウドオブジェクトに直接行くのではなく、モックを使用します。これにより、外部テストの依存関係は削除されます。これは、単体テストのテストでは使用しないでください。コードを単独でテストすることができます。だから、

var mockContext = new Mock<ITableServiceContext>() 
ITableServiceContext context=mockContext.Object 

は、ここで部品番号クイックスタートへのリンクです:あなたの助けをhttp://code.google.com/p/moq/wiki/QuickStart

+0

ありがとう!まあ、間違った言葉を使ったのは明らかです。これは単なる単体テストではなく、むしろ統合テストです。私は依存関係を嘲笑して単体テストを書くことを検討しますが、私も統合テストをしたいと思っています。 – carduus

+0

私の問題の根本は、テストによってUIスレッドをブロックしていたと思います。 BeginContextSaveChanges内のどこかには、実行されないUIスレッドが必要です。 1つの解決策は、私が推測するSilverlight Testing Framework(http://www.jeff.wilcox.name/2009/03/asynchronous-testing/)を使用している可能性があります。 – carduus

+0

私はカスタム回避策に終わった。オブジェクトがあるので、TestHarnessStateと呼んでみましょう。したがって、各テストハーネスは、セットアップ時にそこにテストを登録します(thState.RegisterTest( "testX"))。コールバックでは、ハーネスの各テストでthState.TestFinished( "testX")が呼び出されます。テストランナーを更新して、すべてのテストが終了したとき(thState.AllTestsFinished)、完了したときにのみ結果ページを表示するかどうかを毎秒チェックするタイマーを起動します。それは私にとってうまくいく。 – carduus

関連する問題