C# 重复公共(public)代码的单元测试

标签 c# unit-testing mstest

Possible Duplicate:
What would be an alternate to [SetUp] and [TearDown] in MSTest?

我正在学习如何使用单元测试和自动化测试,但有一些问题我无法弄清楚/找到答案

我目前通过使用多个调用各种方法并在其中包含断言的 [TestMethod] 进行测试。现在,测试方法都有重复的代码来访问数据库并为其余的测试做好准备。一个例子是:

public void TestDBReturnsFooInFormatXyz() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo format is xyz );
}

public void TestDBFooContainsAbc() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo contains abc );
}

所以有一些问题: 在测试类中创建私有(private)字段并让构造函数设置它们是最佳实践吗?

我应该在每个测试方法中都这样做吗,因为测试速度并不那么重要?

我应该在构造函数之上放置什么[测试???]以确保在运行测试时调用它?

我查看了 MSDN 和《Programming Microsoft Visual C# 2008: The Language》一书,但找不到任何有关单元测试的好信息。如果有我应该阅读的资源可以回答这些问题,请告诉我。

谢谢!

最佳答案

重复的代码始终是一种不好的做法,因此您应该重构代码以初始化 TestInitialize Method 中的 foo 对象。 ,在每次测试运行前执行一次,然后在每个测试用例中执行具体操作:

private FooType foo;

[TestInitialize()]
public void TestInitialize()
{
    foo = CreateFooObject();
}

[TestMethod()]
public void TestToAssertThatAbcStuffGetsDone()
{
    foo.DoAbcStuff();
    Assert.IsTrue(foo.DidAbc());
}

[TestMethod()]
public void TestToAssertThatXyzStuffGetsDone()
{
    foo.DoXyzStuff();
    Assert.IsTrue(foo.DidXyz());
}

如果您的 foo 对象需要在每个测试方法运行后被释放,您还应该实现 TestCleanup Method .

但是,using a database in your unit tests is not considered a best practice因为您不希望外部依赖关系影响您的测试结果。相反,您应该使用一个数据库模拟,其行为类似于数据库,但将单元测试与真正的数据库依赖项隔离开来。

一些与数据库相关的问题可能会破坏您的测试,例如连接失败、超时、数据更改和偶尔的数据库升级。 This SO question讨论处理数据库依赖问题的策略。

关于C# 重复公共(public)代码的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13943078/

相关文章:

javascript - 如何使用 ui-router 测试依赖于服务的 AngularJS Controller ?

java - 如何在执行时仅包含某些Java类 "gradle test"

c++ - 如何使用 MSTest 为 C++ 测试设置数据驱动测试?

c# - GUI 启动时的控制台 "Hangs"

c# - 没有无参数构造函数的对象作为类的属性

c# - 洗牌所需的 IEnumerable 扩展方法

.net - 如何在 Moq 中调用作为参数传递的谓词?

c# - 当设置为异步时,是否有人在使用 Ctrl-R、T 运行特定的本地突出显示的测试时遇到问题?

selenium - Appium/WinAppDriver 无法找到上下文菜单 - 但仅在某些机器上

c# - 追加现有的 XML 文件