IDataReader.LoadAsyncメソッドを使用するWindowsStoreクラスライブラリプロジェクトの単体テストを試みています。LoadAsyncメソッドの戻りタイプであるDataReaderLoadOperationを除いて、必要なIDataReaderのすべての部分を実装する独自のスタブを作成できます。これはパブリックコンストラクターのない封印されたクラスであるため、スタブのLoadAsyncメソッドから何を返すかわかりません。
私がテストしているコードは、await
それ以外はLoadAsyncの結果を使用していないため、スタブからnullを返してみました。ただし、フレームワークがnullのDataReaderLoadOperation(IAsyncOperation <uint>)をタスクに変換しようとし、NullReferenceExceptionをトリガーするため、これによりAggregateExceptionがスローされます。
Microsoft Fakesは、ストアの単体テストプロジェクトでも利用できず、通常の単体テストプロジェクトでのみ利用できるようです。そのため、どちらも役に立ちません。
Windows Storeの単体テストプロジェクトのDataReader.LoadAsyncをモックするにはどうすればよいですか?
編集:スティーブンの答えによると、私は代わりにIInputStreamをモックしました。以下は参考のために私のモックです。
internal class InputStreamStub : IInputStream
{
public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
{
return
AsyncInfo.Run<IBuffer, uint>
(
(token, progress) =>
Task.Run<IBuffer>
(
() =>
{
progress.Report(0);
token.ThrowIfCancellationRequested();
var source = Encoding.UTF8.GetBytes(reads.Dequeue());
Assert.IsTrue(buffer.Capacity > source.Length); // For the purposes of the unit test, the buffer is always big enough
if (source.Length > 0) // CopyTo throws an exception for an empty source
source.CopyTo(buffer);
buffer.Length = (uint) source.Length;
progress.Report(100);
return buffer;
},
token
)
);
}
public void Dispose()
{
}
private Queue<string> reads = new Queue<string>(new[]
{
"Line1\r\nLine",
"2\r\nLine3\r",
"\nLine4",
"",
"\r\n",
"Line5",
"\r\n",
"Line6\r\nLine7\r\nLine8\r\nL",
"ine9\r",
"\n"
});
}