FakeItEasy:当匿名类型为 returned 时伪造 return 值

FakeItEasy: faking return value when anonymous type is returned

我有一个函数:

TResult ShowDialogWindow<TViewModel, TView, TResult>(Func<TViewModel> viewModelActivator,
            Func<TViewModel, TView> viewActivator,
            Func<TViewModel, TView, TResult> dialogResultFunc)

我想伪造函数的 return 值,除了代码 returns 是一个匿名类型,如下所示:

_dialogService.ShowDialogWindow(() => new ViewModel(),
  viewModel =>  new View(viewModel),
  (viewModel, view) => new { view.DialogResult, view.SomeOtherInfo });

我查看了一些预先存在的答案和讨论,但它们处理匹配参数而不是 return 类型:

有什么建议吗?

P.S。我目前的解决方法是避免 returning 匿名类型。

不幸的是,没有简单的方法可以做到这一点。每个程序集都定义了匿名类型;换句话说,如果您在测试程序集中定义了一个与被测程序集中的匿名类型相同的匿名类型,那么它实际上不是同一类型。

您也许可以使用 A.CallTo(dialogService).Where(call => ...) 做一些事情,但这会很痛苦,因为您将不得不放弃强类型并改用反射。

最好不要使用匿名类型; tuples and records 是一个很好的轻量级替代品。