我正在尝试为我的类编写一堆单元测试,其中大部分是持久的。
在我的测试类中,我有一堆成员变量,其中包含我正在推送到我的对象中的数据,然后在存储库中创建。
首批测试之一是根据成员变量中的数据在存储库中创建记录。然后,我从数据存储区中检索UniqueIdentifier,并将其设置为其中一个成员变量。
在后面的一个测试中,我想使用UniqueIndentifier从数据存储区中检索记录,但值为null,就好像该值尚未设置一样!
顺便说一句,我正在使用MSTest(默认的visual studio)。
如果有人有任何建议我会非常感激。
答案 0 :(得分:2)
您的测试应该都很小,独立且快速。理论上,单元测试可以以任何顺序,单独或作为一组测试运行,并且它们不应该依赖于任何配置值(例如连接字符串)。
听起来您正在尝试持久保存到物理数据存储,然后在稍后的测试中测试该值实际存在。现在,您已经编写了一个依赖于先前测试的测试。这个设置太脆弱了。
编辑1
我不测试我的存储库。我使用NHibby,我知道它有效,只要我的配置有效。如果我的配置错误,我不会使用单元测试来验证这一点。
我编写MVC或WPF / M-V-VM应用程序。使用这些样式,可以非常轻松地针对控制器或视图模型层编写测试。我将以类似于
的方式模拟我的存储库[TestMethod]
public void TestThatSomethingHappens()
{
var repo = new Mock<IRepository>();
repo.Setup(x => x.Find<Customer>(It.IsAny<int>())).Returns(_somePredefinedCustomer);
// etc.
}
因此,当我的代码从存储库中提取值时,它将提取预定义的客户,并且该客户已经构建在测试设置方法(或构造函数,如果您使用的是xUnit)中。如果我想测试没有找到客户时会发生什么,那将是一个不同的测试,我会有.Returns(null)
,看看我的控制器或WinForm做了什么。
答案 1 :(得分:1)
听起来您可能正在进行集成测试。正如Jarett所提到的那样,你的测试是因为他们依赖于先前测试中的状态而变得脆弱。如果您需要为测试设置某种状态,请查看使用TestInitialize
属性和TestCleanup
属性。每次Test run都会调用这些方法。如果您需要为整个测试组设置状态,可以使用ClassInitialize
和ClassCleanup
但是可能不建议这样做,因为我认为在运行MSTests时不能保证订单。
全部放在一起
[ClassInitialize]
public void ClassInitialize()
{
//Do something to create the data store, create files, setup DB, etc..
}
[ClassCleanup]
public void ClassCleanup()
{
//Tear down the resources
}
[TestInitialize]
public void TestInitialize()
{
//inject some data for the test from the resource created in ClassInitialize()
}
[TestCleanup]
public void TestCleanup()
{
//Clean up any data or values you injected into your datastore from TestInitialize()
}