FakeItEasy:返回匿名类型时伪造返回值

问题描述

我有一个功能

TResult ShowDialogWindow<Tviewmodel,TView,TResult>(Func<Tviewmodel> viewmodelActivator,Func<Tviewmodel,TView> viewActivator,TResult> dialogResultFunc)

我想伪造函数的返回值,除了代码返回这样的匿名类型:

_dialogService.ShowDialogWindow(() => new viewmodel(),viewmodel =>  new View(viewmodel),(viewmodel,view) => new { view.DialogResult,view.someOtherInfo });

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

有什么建议吗?

附言我目前的解决方法是避免返回匿名类型。

解决方法

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

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

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