模拟DataReader for Windows Store Unit Test项目

时间:2012-12-24 10:25:07

标签: unit-testing windows-runtime winrt-async

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

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

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

如何为Windows应用商店单元测试项目模拟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"
    });
}

2 个答案:

答案 0 :(得分:2)

我建议模拟基础流,并在模拟流上使用常规DataReader

答案 1 :(得分:0)

你能用适配器包装数据读取器并针对它编写单元测试吗?