gpt4 book ai didi

c# - 如何使用异步调用对 Prism INavigationAware.OnNavigatedTo 进行单元测试

转载 作者:行者123 更新时间:2023-12-03 10:31:12 27 4
gpt4 key购买 nike

我们的许多 ViewModel-Unit-Tests 在 Arrange-Phase 中创建一个 ViewModel,在 Act-Phase 中调用 OnNavigatedTo() 并断言一些在 OnNavigatedTo 完成后应该发生的事情(例如,某些 Properties 包含某些值)。
当 OnNavigatedTo() 的实现包含异步方法调用(例如从后端加载数据)时,我们会遇到问题,因为 OnNavigatedTo 返回 void,我们不能等待它完成。
在我们的单元测试中,我们模拟了对后端的调用,因此它们会立即返回并且问题几乎不会出现。然而,我们有一个案例,正是这种情况在构建服务器(在 Linux 上运行)上引起了问题,我怀疑这总是会产生一种竞争条件,这种情况在大多数情况下只是偶然发生的。
我们想出的一种解决方法是提供一个公共(public)方法返回一个包含 OnNavigatedTo 实现并由单元测试使用的任务,但通常不是为了扩展被测系统的公共(public) API 表面测试。
在我看来,将所有代码移动到 IInitializeAsync.InitializeAsync 不是一个选项,而且这两个生命周期 Hook 并不等效,并且可能不会在每个页面导航上调用 InitializeAsync。
所以我的问题是:我们如何可靠地对 INavigationAware.OnNavigatedTo 中的代码进行单元测试,从而进行异步调用?

最佳答案

One workaround we came up with was to provide a public method returning a Task which contains the implementation of OnNavigatedTo and is used by the unit tests


我会这样做,只是我会使用 internal (如果夹具必须在另一个组件中,则使用 InternalsVisibleTo 或什至 private (如果您可以使夹具成为嵌套类)。
或者,定义您自己的 INavigatedToAsyncForTest (使用返回 Task 的方法)并显式实现它以限制这些方法的可发现性。

but it's generally no good idea to extend the public API surface of the system under test just for the sake of testing.


没错,但是制作方法 internal尖叫“这不是公共(public) API”,特别是如果类型本身是 internal (应该是哪些 View 模型,除非您必须将 View 放在不同的程序集中),因此您可以在一定程度上减轻这种情况。

关于c# - 如何使用异步调用对 Prism INavigationAware.OnNavigatedTo 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63723400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com