我正在尝试对使用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"
});
}