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と関係がありますか?
ありがとう!
ありがとう!まあ、間違った言葉を使ったのは明らかです。これは単なる単体テストではなく、むしろ統合テストです。私は依存関係を嘲笑して単体テストを書くことを検討しますが、私も統合テストをしたいと思っています。 – carduus
私の問題の根本は、テストによってUIスレッドをブロックしていたと思います。 BeginContextSaveChanges内のどこかには、実行されないUIスレッドが必要です。 1つの解決策は、私が推測するSilverlight Testing Framework(http://www.jeff.wilcox.name/2009/03/asynchronous-testing/)を使用している可能性があります。 – carduus
私はカスタム回避策に終わった。オブジェクトがあるので、TestHarnessStateと呼んでみましょう。したがって、各テストハーネスは、セットアップ時にそこにテストを登録します(thState.RegisterTest( "testX"))。コールバックでは、ハーネスの各テストでthState.TestFinished( "testX")が呼び出されます。テストランナーを更新して、すべてのテストが終了したとき(thState.AllTestsFinished)、完了したときにのみ結果ページを表示するかどうかを毎秒チェックするタイマーを起動します。それは私にとってうまくいく。 – carduus