我遇到的情况是,在视图上,我有2个内容区域,我想要远离父视图单元测试导航。在我从此视图导航之前,我想验证内容区域中显示的两个视图是否允许我导航。为此,视图的所有三个视图模型都实现IConfirmNavigationRequest
接口。
对于我的主视图,ConfirmNavigationRequest
调用看起来类似于RegionManager
是IRegionManager
的实现:
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
/* setup code */
RegionManager.RequestNavigate("regionA",
new Uri("viewA, UriKind.Relative), ViewACallback,
navigationResult?.Context?.Parameters);
}
private void ViewACallback(NavigationResult navigationResult)
{
if(!navigationResult.Result ?? false) return;
/*Some Code */
RegionManager.RequestNavigate("regionB",
new Uri("viewB, UriKind.Relative), ViewBCallback,
navigationResult?.Context?.Parameters);
}
private void ViewBCallback(NavigationResult navigationResult)
{
/* some logic */
}
使用模拟的IRegionManager
实例,我可以模拟区域请求回调并实现单元测试。我遇到的问题是,链中的每一步我都会得到之前测试中的重复代码。它在整个地方发出代码味道,我只是在寻找如何清理它。
我目前的想法是使用接口将回调抽象到他们自己的类中,并且能够以这种方式模拟链,但这似乎是很多开销。另一个想法是将回调暴露为内部并验证在RequestNavigate
调用上传递的回调是正确的回调,然后独立地测试它们。这对我来说似乎更干净,但这是将这些作为内部暴露的唯一理由。
正在寻找一些关于如何在这样的场景中正确地测试回调的文章的一些想法或方向。