我正在尝试对使用IDataReader.LoadAsync方法的Windows应用商店类库项目进行单元测试。我能够创建自己的存根,它实现了我需要的IDataReader的所有部分,除了LoadAsync方法的返回类型 - DataReaderLoadOperation。这是一个没有公共构造函数的密封类,所以我不知道从存根的LoadAsync方法返回什么。
我正在测试的代码不使用LoadAsync的结果,除了await
它,所以我尝试从我的存根中返回null。但是,这会抛出AggregateException,因为框架会尝试将null DataReaderLoadOperation(它是IAsyncOperation< uint>)转换为Task并触发NullReferenceException。
似乎Microsoft Fakes不适用于Store单元测试项目,仅适用于常规单元测试项目,因此也无济于事。
如何为Windows应用商店单元测试项目模拟DataReader.LoadAsync?
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"
});
}
答案 0 :(得分:2)
我建议模拟基础流,并在模拟流上使用常规DataReader
。
答案 1 :(得分:0)
你能用适配器包装数据读取器并针对它编写单元测试吗?