1

我正在尝试对使用IDataReader.LoadAsync方法的 Windows Store 类库项目进行单元测试。我能够创建自己的存根,它实现了我需要的 IDataReader 的所有部分,除了 LoadAsync 方法的返回类型 - DataReaderLoadOperation。这是一个没有公共构造函数的密封类,所以我不知道从我的存根的 LoadAsync 方法返回什么。

我正在测试的代码除了它之外没有使用 LoadAsync 的结果await,所以我尝试从我的存根返回 null。但是,这会引发 AggregateException,因为框架会尝试将 null DataReaderLoadOperation(它是一个 IAsyncOperation<uint>)转换为 Task 并触发 NullReferenceException。

似乎 Microsoft Fakes 也不适用于 Store 单元测试项目,仅适用于常规单元测试项目,所以这也无济于事。

如何模拟 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 回答