【发布时间】:2020-12-22 16:15:48
【问题描述】:
我们的很多 ViewModel-Unit-Tests 在 Arrange-Phase 创建一个 ViewModel,在 Act-Phase 调用 OnNavigatedTo() 并断言一些在 OnNavigatedTo 完成后应该发生的事情(例如,一些 Properties 包含某些值)。
当 OnNavigatedTo() 的实现包含异步方法调用(例如从后端加载数据)时,我们会遇到问题,因为 OnNavigatedTo 返回 void,我们无法等待它完成。
在我们的单元测试中,我们模拟了对后端的调用,因此它们会立即返回并且问题几乎不会出现。然而,我们有一个案例,正是这种情况导致构建服务器(在 Linux 上运行)出现问题,我怀疑这总是会产生一种竞争条件,这种情况在大多数情况下只是偶然发生的。
我们想出的一个解决方法是提供一个公共方法,该方法返回一个包含 OnNavigatedTo 实现并由单元测试使用的任务,但通常不是为了扩展被测系统的公共 API 表面为了测试。
在我看来,将所有代码移至 IInitializeAsync.InitializeAsync 不是一个选项,而且这两个生命周期挂钩并不等效,并且可能不会在每个页面导航上调用 InitializeAsync。
所以我的问题是:我们如何可靠地对 INavigationAware.OnNavigatedTo 中的代码进行单元测试,从而进行异步调用?
【问题讨论】:
-
在某些情况下,您可以在调用被测主题后使用
Task.Delay,以便在做出断言之前有足够的时间让异步内容完成。
标签: c# unit-testing mvvm xamarin.forms prism