我们有一个WPF应用程序。许多ViewModel使用必须被模拟的相同依赖项。有时,ViewModels的构造函数有太多的依赖关系(过度注入),其唯一意图是公开-不允许进行单元测试。例如:
[ImportingConstructor]
public PasswordInputViewModel(
IPaymentSystemProvider provider,
IAppContext appCtx,
IEventAggregator eventAggregator,
IPromptCreator promptCreator) {
}
关键是三个依赖关系是基础架构的依赖关系。仅出于允许单元测试的目的而将它们公开以进行显式注入,这比ViewModel依赖项的有用信息会增加更多的噪音。特别是因为几乎所有VM都具有这些依赖关系。
因此,我们将这些依赖项移至BaseViewModel
该类中:
public class ScreenExtended : Screen {
[Import]
public IEventAggregator eventAggregator { get; private set; }
[Import]
public IPromptCreator Prompt { get; private set; }
[Import]
public IAppContext CurrentApp { get; private set; }
}
现在,我们需要以某种方式通过逃避构造函数注入的单元测试来模拟它们。因此,我们可以引导IoC。
现在的问题是:如何在此处正确使用IoC?为每个类,每个测试引导IoC,还是将其设置为静态并仅初始化一次?如果我们将其设置为静态,则需要以某种方式重新构造IoC。你会推荐什么?
我会说这取决于注入的项目是具体实现还是模拟对象。如果使用的是具体实现,则在类级别进行初始化时,测试之间可能会出现状态问题。
我通常会重新初始化每个测试的每个依赖关系,甚至是一个具体的类(它会在模拟存储库顶部模拟服务层)。在测试CRUD类型的功能时,尽管需要花费更长的时间,但确实能够将每个测试重置为零。而是要有一个可以正确可靠地单独运行或在列表中运行的测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句