【发布时间】:2015-07-02 09:41:57
【问题描述】:
在我的单元测试中,我需要测试对数据库的查询(不,我不是在模拟这些,因为我需要检查它们是否获得了正确的数据)。我也有一些完全不联系数据库的普通方法,以及一些可以对数据库使用模拟的方法。
为了应对数据库单元测试,我创建了一个名为DbUnitTest 的类,如果需要连接到数据库,每个单元测试类(用于服务)都可以从该类继承。
这个类看起来是这样的
[TestClass]
public abstract class DbUnitTest
{
protected IDataContext _context;
[TestInitialize]
public void TestInit()
{
_context = new DataContext();
// drop if exists
if (_context.Database.Exists())
_context.Database.Delete();
// initialize
System.Data.Entity.Database.SetInitializer(new ForceDeleteInitializer(new DbUnitTestInitializer()));
_context.Database.Initialize(true);
}
}
这可行,并且对于每个测试,它都会删除数据库并创建一个新数据库。然后我可以在每个单元测试中插入我想要的任何数据并检查数据是否正确。
但是现在我正在单元测试的一些服务类不需要真正的数据库,因此删除数据库、初始化数据库等似乎没有意义,因为这需要时间。
我想也许我可以针对每个测试创建一个属性,例如 UseDb 和 UseMock。然后在我的基础 DbUnitTest 类中,我可以将方法更改为这样的
[TestClass]
public abstract class DbUnitTest
{
protected IDataContext _dbContext;
protected Mock<IDataContext> _mockContext;
[TestInitialize]
public void TestInit()
{
// How do I check for an attribute here??
if (method has UseDb attribute)
{
_dbContext = new DataContext();
// drop if exists
if (_dbContext.Database.Exists())
.Database.Delete();
// initialize
System.Data.Entity.Database.SetInitializer(new ForceDeleteInitializer(new DbUnitTestInitializer()));
_dbContext.Database.Initialize(true);
}
if (UseMock attribute)
{
// mock context
_mockContext = new Mock<IDataContext>();
}
}
}
但我不确定如何确定当前正在运行的单元测试方法是否包含特定属性,或者是否可以确定?
这将使我受益于每个测试都能够创建新数据库或使用模拟。
谁能帮帮我?
我知道我真的可以将单元测试类拆分为 2 个文件,但我认为这会将服务的所有测试保存在一个地方并提供灵活性。
【问题讨论】:
-
我打算建议一种多文件方法 - 但我看到你已经考虑过了。无法通过解决方案提供任何东西 - 但我很想看看是否有其他解决方法。
标签: c# asp.net .net unit-testing testing