我们的许多ViewModel-Unit-Tests在Arrange-Phase中创建一个ViewModel,在Act-Phase中调用OnNavigatedTo(),并声明在OnNavigatedTo完成后应该发生的某些事情(例如,某些Properties包含某些值)。
当OnNavigatedTo()的实现包含异步方法调用(如从后端加载数据)时,我们会遇到问题,因为OnNavigatedTo返回void,我们无法等待其完成。
在单元测试中,我们模拟了对后端的调用,因此它们立即返回,并且问题几乎从未出现。但是,在某些情况下,正是这种情况在构建服务器上(在Linux上运行)导致了问题,并且我怀疑这总是会产生一种竞态条件,而这种竞态条件通常在大多数情况下都是偶然的。
我们想出的一种解决方法是提供一个返回Task的公共(public)方法,该方法包含OnNavigatedTo的实现并供单元测试使用,但是通常为了扩展被测试系统的公共(public)API表面不是一个好主意。测试。
在我看来,将所有代码都移到IInitializeAsync.InitializeAsync是不可行的,并且这两个生命周期钩子(Hook)并不等效,并且可能不会在每次页面导航中调用InitializeAsync。
所以我的问题是:我们如何才能在进行异步调用的INavigationAware.OnNavigatedTo中可靠地对代码进行单元测试?
最佳答案
除了使用internal
(如果灯具必须在另一个程序集中,请与InternalsVisibleTo
一起使用)或什至private
(如果可以使灯具成为嵌套类),我将完全这样做。
或者,定义自己的INavigatedToAsyncForTest
(使用返回Task
的方法)并显式实现以限制这些方法的可发现性。
的确如此,但是使方法internal
尖叫“这不是公共(public)API”,特别是如果类型本身是internal
( View 模型应该是,除非必须将 View 放在不同的程序集中),因此,您可以在某种程度上缓解这种情况。
关于c# - 如何使用异步调用对Prism INavigationAware.OnNavigatedTo进行单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63723400/