【发布时间】:2013-03-04 17:42:04
【问题描述】:
我想通过模拟依赖项来编写一个单元测试用例。整体流程如下。
我们有一个WorklistLoader,它有一个异步方法LoadWorklistItemsAsync()。要完成此任务WorklistLoader 依赖于较低层 API(我想模拟)QueryManager.StartQueryTask()。 StartQueryTask() 也是一种异步方法,它查询文件系统并定期引发ProgressChanged(),然后在最后引发CompletedEvent。 StartQueryTask() 返回对 TPL Task 的引用。
StartQueryTask 的签名是
Task StartQueryTask(
"SomeId",
EventHandler<ProgressChanged> progressChanged,
EventHandler<QueryCompleted> queryCompleted);
一旦WorklistLoader 从QueryManager 接收到ProgressChanged 事件,它会进行一些处理,然后引发其ProgressChanged 事件(ViewModel 已订阅该事件)。
我想通过模拟QueryManager.StartQueryTask() 来测试WorklistLoader 的LoadWorklistItemsAsync() 方法。
这是我的问题。
- 使用模拟为
Async()方法编写单元测试的最佳做法是什么? - 如何为依赖项使用 TPL 的方法编写单元测试用例?(返回
Task类型的方法)
另一个问题是
- 如果我使用 Rhinomocks 模拟我的 QueryManager.StartQueryTask() 方法,它会是什么样子? (模拟代码。它必须引发progresschanged、completed 事件并返回Task)。
【问题讨论】:
-
您是在使用模拟框架,还是只是手动实现接口/子类化自己?
-
问题 1 真的与异步没有任何关系,只是模拟。例如无论使用模拟的最终方法是异步还是同步,您都必须以某种方式将模拟注入
WorklistLoader。至于2,我建议你看看srtsolutions.com/testing-async-methods-in-c-5
标签: .net unit-testing nunit rhino-mocks