【问题标题】:Unit testing a menu in ASP.NET MVC 2对 ASP.NET MVC 2 中的菜单进行单元测试
【发布时间】:2010-11-30 11:38:08
【问题描述】:

我已经阅读了一些关于单元测试的内容,并想从我的第一个测试开始。我正在使用 ASP.NET MVC 2。

我们通过获取员工编号并对照Roles 表检查来确定用户类型。如果用户存在于该表中,则设置UserType 属性。

我们为每种类型的用户提供了一个菜单,并且每种类型的用户的每个菜单项都不同。

为每种类型的用户显示菜单项的测试会是什么样子?

【问题讨论】:

    标签: c# asp.net-mvc unit-testing mocking nunit


    【解决方案1】:

    如果您已经编写了应用程序,根据某些人的说法,您现在将使用“遗留代码”(基于 Michael Feather 的书有效地使用遗留代码 - 通过“遗留代码”羽毛表示任何不是被单元测试充分覆盖)。

    正如@bAN 所提到的,您必须做很多工作来隔离您将调用的方法,方法是使用可以替换为 "stubs"工厂方法 > 使用接口或使用override。如果没有这个,您将进行集成测试(因为您还将测试不同功能原子之间的集成)。但是,在几乎所有情况下,测试方法与生产方法的 1:1 比例并不能提供足够的覆盖率。

    根据您的 Visual Studio 版本,测试工具的数量会有所不同。 NUnit 是一个非常流行的测试框架:http://www.nunit.org/,如果您不使用 Visual Studio 工具。

    要进行测试,您可以:

    创建一个名为 YourProjectUnderTestName.Tests.Unit 的类型为 Test Project 的新项目。

    您将看到测试类具有属性[TestClass],而测试方法具有属性[TestMethod]

    您还必须查看Assert 类及其静态方法http://msdn.microsoft.com/en-us/library/ms182530.aspx

    您应该在测试中遵循 Arrange、Act、Assert 模式。获取运行要单独测试的代码所需的一切,然后运行被测代码,然后使用 Asserts 针对预期行为进行测试。

    您有时还需要了解 [SetUp]/[TearDown] 方法(在 MSUnit 中),这些方法具有以下属性:
    [ClassInitialize()][TestInitialize()]
    [TestCleanup()][ClassCleanup()]

    ClassInitialize 在任何测试开始之前运行,TestInitialize 在班级中的每个测试之前运行,TestCleanup 在班级中的每个测试之后运行,ClassCleanup 在所有测试完成后运行。

    正如@bAN 所说,浏览http://artofunittesting.com/ 网站并认真考虑购买这本书。如果办公室着火了,我会拿它和 Code Complete 一起拿。

    正如@bAN 和@Oliver Hanappi 所提到的,TDD 是确保您进行“正确”单元测试并获得良好覆盖率的一种非常好的方法。

    祝你好运!

    【讨论】:

    • 谢谢。我要订购这本书。
    【解决方案2】:

    单元测试是一个“微观”的测试单元,因此您必须为要测试的类中的每个方法编写单元测试。 使用 Visual Studio 进行单元测试非常简单,您只需右键单击类并更改生成单元测试。 他为您制作了 Test 类,您只需编写测试该方法的代码。

    每个单元测试都必须只测试方法而不是另一个类的另一个方法。因此,如果您正在测试的方法调用另一个方法,您必须使用模拟对象测试 CALL。

    一本关于单元测试的伟大而有用的书。 Art of Unit Testing

    【讨论】:

    • 请不要先编写生产代码,也不要遵循每个方法一个单元测试的模式。如果你这样做了,那么你肯定不会做 TDD(测试驱动开发)。
    • @Oliver:我认为单元测试是关于测试每个代码单元,在你的情况下是每个方法?
    • 对我来说(但我确信这不是最好的方法)我首先为我要编写的方法编写单元测试,然后我编写方法直到测试正常,最后重构我的代码(cmets 等),但我确信有更好的方法。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多