1

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"
    });
}
4

2 に答える 2

2

基になるストリームをモックし、モックされたストリームに対して通常のストリームを使用することをお勧めしDataReaderます。

于 2012-12-24T14:19:34.257 に答える
0

データリーダーをアダプターでラップし、それに対する単体テストを記述できますか?

于 2012-12-24T10:37:25.807 に答える