如何从模拟对象 return DispatcherOperation<T>

How to I return a DispatcherOperation<T> from mocked object

我有一个方法 return DispatcherOperation<TResult> 对象:

public DispatcherOperation<TResult> InvokeAsync<TResult>(Func<TResult> callback)
{
    return this.UIDispatcher.InvokeAsync(callback);
}

它在应用程序中的使用方式:

var res = await this.dispatcher.InvokeAsync(() =>
                                             {
                                                // returns a List<string> by computing some logic
                                             });

而且我已经使用最小起订量模拟了这个方法:

this.mockDispatcher.Setup(x => x.InvokeAsync(It.IsAny<Func<List<string>>())).Callback((Func<List<string>> callback) => callback.Invoke());

但问题是调用方法不等待响应并以空异常结束。

我知道回调不应该用于 return 值,但我无法找出一个 return 方法可以 return 类型 DispatcherOperation<T>

这是我正在尝试的:

this.mockDispatcher.Setup(x => x.InvokeAsync(It.IsAny<Func<List<string>>>())).Returns((Func<List<string>> callback) => callback()));

我如何return它作为DispatcherOperation<List<string>>

您可以很容易地模拟 Task<T>

public Task<TResult> InvokeAsync<TResult>(Func<TResult> callback)
{
    return this.UIDispatcher.InvokeAsync(callback).Task;
}
this.mockDispatcher.Setup(x => x.InvokeAsync(It.IsAny<Func<List<string>>())).Callback((Func<List<string>> callback) => Task.FromResult(callback.Invoke()));

模拟像 Task<T> 这样的通用类型比像 DispatcherOperation<TResult> 这样的框架特定类型要容易得多。但是,如果您 必须 使用 DispatcherOperation<TResult>,您还可以选择创建一个测试 Dispatcher 实例(并执行所有消息泵送和必要的事情)像那样更重的模拟)。