如何在单元测试中正确使用IoC?

Sane开发人员

我们有一个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。你会推荐什么?

Toadflakz

我会说这取决于注入的项目是具体实现还是模拟对象。如果使用的是具体实现,则在类级别进行初始化时,测试之间可能会出现状态问题。

我通常会重新初始化每个测试的每个依赖关系,甚至是一个具体的类(它会在模拟存储库顶部模拟服务层)。在测试CRUD类型的功能时,尽管需要花费更长的时间,但确实能够将每个测试重置为零。而是要有一个可以正确可靠地单独运行或在列表中运行的测试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章