3

ジオロケーターのGetGeopositionAsyncのこのオーバーロードを使用して、WindowsStoreの単体テストプロジェクトでこの単体テストを実行します。

[TestMethod]
public async Task TestFunc()
{
  var locator = new Windows.Devices.Geolocation.Geolocator();

  var l = await 
          locator.GetGeopositionAsync(TimeSpan.MaxValue, TimeSpan.FromSeconds(10));

  Assert.IsNotNull(l);
}

しかし、このテストは合格しないだけでなく、10秒後にバンクアウトすることもありません-それは決して終了しません(私はそれを殺す前に10分間待っていました)。

これは、実際に実行したかったテストのペアダウンバージョンであることを強調する必要があります。Windowsの単体テストだけを試みているのではありません。John Detersの回答で指摘されているように、代わりに偽物を使用することもできます。

また、イベントをサブスクライブして(後者はロケーターを初期化する必要があります)、1分間待機する別のテストを作成しましGeoLocatorた。ハンドラーでは、Geolocatorを作成するとすぐにトレースすることに加えて、現在のをトレースします。StatusChangedPositionChangedStatusChangedLocationStatus

このLocationStatusテストのGeolocatorのは、で始まり、NotInitialised変更されることはありません。

今、私はこれが次の事実に関係するブロッキングの問題であると考えています(GetGeopositionAsync最初のリンクのドキュメントから引用):

GetGeopositionAsyncを呼び出すためのGeolocatorオブジェクトの最初の使用は、同意プロンプトをユーザーに表示できるように、UIスレッドで行う必要があります。詳細については、個人データにアクセスするデバイスのガイドラインを参照してください。

だから私の推測は次のいずれかです:

  • a)呼び出しUIスレッドで行われていますが(可能性は低いです)、UIサーフェスがないため(Windowsストアの単体テストのデバッグ時にときどき表示される奇妙な黒い画面を除く)、UIを表示できないため、呼び出しが行われます。決して完了しません。
  • b)UIスレッドで呼び出し行われていないため、UIを表示できないため、呼び出しが完了しません。

Geolocatorいずれにせよ、位置情報サービスにアクセスするために自分の単体テストに同意することは不可能であるため、WindowsStoreの単体テストで使用することは不可能であるという結論に達しました。同様に、そのようなコアコンポーネントが、UIを表示できないという理由だけで、それ自体が無期限に実行されることを許可することに失望しています-それはただ貧弱です。

誰もがこれに直面しなければなりませんでしたか?ジオロケーションを使用するコードを単体テストできると本当にいいでしょう!

4

2 に答える 2

1

ライブラリ呼び出しを単体テストするべきではありません。単体テストでは、独自のロジックのみをテストする必要があります。

次に、UI同意ポップアップダイアログやタイムアウト遅延がないため、モックGeolocatorオブジェクトを提供することでこの問題を完全に回避できます。

于 2012-11-30T18:30:46.087 に答える
1

これが私が発見したものです。

私のデスクトップ(企業プロキシの背後)では、Geolocatorが初期化を完了しません。その結果、現在の場所を何にでも使用できるアプリはありません。単体テストだけに限定されているわけではありません。

ただし、シミュレーターでコードを実行するとすぐに、すべて正常に機能します。

これは、GPS受信機がないため、デスクトップにロケーションプロバイダーがインストールされていないという事実に最終的に関連していると思います。私が絶対に信じられないのは、デバイスがネットワークロケーションを使用するためのフォールバックロケーションプロバイダーがないこと、または存在する場合は、企業プロキシの背後では機能しないことです。

Geolocatorいずれにせよ、現状では、クラスからの場所を必要とするデスクトップ上のコード(単体テストまたはアプリ自体内)をテスト/デバッグすることはできません。ああ、それが二度と戻らない状況のために私の取り扱いをテストすることは別として!

于 2013-01-17T08:12:17.143 に答える