【问题标题】:Could model unit tests be truly independent and how [ASP.NET MVC]模型单元测试能否真正独立以及如何[ASP.NET MVC]
【发布时间】:2010-03-23 09:17:35
【问题描述】:

我是整个单元测试方面的新手,所以请原谅我缺乏经验。我读过很多材料说没有测试应该依赖于其他人来做,即单元测试彼此完全独立。现实中真的可以做到吗?我有以下示例:我有几个相互依赖的实体类,基于某个数据库模式(我使用 Linq-to SQL 来生成它们)现在,如果我想测试我必须构建的每个模型类模型类的一个对象,为其每个依赖项构建一个测试对象,将它们分配给对象的属性,然后在检查上下文并断言它确实有效之前持久化该对象。

这显然使得制作不相互依赖或不按特定顺序运行的测试变得更加困难(在我至少有一个 ContentType 类型的实例之前,我不会创建 Content 类型的实例) 依赖性,至少在模型级别存在并且无法避免。

如果你认为我错了,请多多批评我。我想学习。

附:顺便提一下,我正在开发一个 ASP.NET MVC 应用程序并使用 NUnit 进行测试,如果这有意义的话

【问题讨论】:

    标签: asp.net-mvc unit-testing linq-to-sql nunit


    【解决方案1】:

    是的,你真的可以在现实中做到这一点。

    能够隔离每个单元的关键是编写松散耦合代码。依赖 LINQ to SQL (L2S) 类并不是松散耦合的,这就解释了你的问题。

    您最好定义一组可以隐藏 L2S 代码的接口。然后域模型在这些接口上工作,而不是直接在 L2S 类上工作。

    【讨论】:

    • 你的意思是,我应该更好地测试控制器,或者如果我使用存储库模式,测试存储库,对吗?
    • 您应该(或多或少地)测试所有代码或您的代码(每个单元隔离),但存储库模式是松散耦合的一个很好的例子。这意味着您可以独立于具体存储库对控制器进行单元测试,并且在其他单元测试中您可以测试具体存储库(无需处理控制器)。
    【解决方案2】:

    是的,单元测试应该(并且可以)是独立的。您描述的问题是关于依赖性的。应该使用依赖注入框架来解决依赖关系(参见 AutoFac,Ninject 项目)。

    另一件事是您的数据库应该使用模拟对象进行模拟(请参阅 Moq,Rhino Mocks 项目)。即使您的数据库已断开连接,您也需要测试所有代码。

    另一件事是单元测试应该只测试一个功能而不是你的所有过程。

    【讨论】:

      【解决方案3】:

      您在这里描述的不是单元测试,而是集成测试。因为您的应用程序的数据模型与数据库紧密耦合,所以您的测试可能测试的是数据库功能,而不是“数据模型”。

      这很好 - 请记住,集成测试需要设置(在您的案例数据库中)并且需要更长的时间才能运行。

      您可能还为您的控制器进行了单元测试,这些单元测试可以与其他组件完全隔离并且不需要数据库来运行,这些就是您所说的单元测试。

      如果您不测试实际的数据库功能,您可以使用假/模拟对象来替换外部类 - 事实上,使用初始 MVC 项目创建的测试有一个手动滚动的假对象,可以做到这一点。

      另一种“隔离”外部依赖项的方法是使用您自己的类扭曲 Linq2Sql 代码,并使用 Mocking 框架伪造这些类调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多