我正在为我的 C#.NET 应用程序的持久层编写一些单元测试。在测试类的测试执行之前和之后,我想做一些清理以清除可能插入的虚拟值,因此,这种清理发生在标有属性 [ClassInitialize( )]
和 [ClassCleanup()]
。
(我知道更好的方法是使用内存数据库,但就我们依赖大量存储过程而言,这并不是真正可行的....)
我想输出一些关于清理结果的信息,但我找不到在 VISUAL Studio 2010 测试结果中获取输出的方法。
这就是我目前所做的:
///... lots of stuff before ...
//global for the test run
private static TestContext context;
//for each test
private IRepository repo;
#region Initialisation and cleanup
/// <summary>
/// Execute once before the test-suite
/// </summary>
[ClassInitialize()]
public static void InitTestSuite(TestContext testContext)
{
context = testContext;
removeTestDataFromDb();
}
[ClassCleanup()]
public static void CleanupTestSuite()
{
removeTestDataFromDb();
}
private static void removeTestDataFromDb()
{
context.WriteLine("removeTestDataFromDb starting");
using (ISession session = NHibernateHelper.OpenSession())
{
IDbConnection cn = session.Connection;
IDbCommand cmd = cn.CreateCommand();
//remove anyt test data
cmd.CommandText = @"DELETE FROM SomeTable
WHERE somefield LIKE 'easyToFindTestData%Test'";
int res = cmd.ExecuteNonQuery();
context.WriteLine("removeTestDataFromDb done - affected {0} rows", res);
}
}
[TestInitialize()]
public void InitTest()
{
repo = new MyRepositoryImplementation();
}
[TestCleanup()]
public void CleanupTest()
{
//cleanup
repo = null;
}
#endregion
我正在尝试使用 context.WriteLine() ...
我也尝试过使用 Console.WriteLine() 得到相同的结果。
如何在 ClassInitialize
部分写入标准输出,您可以在哪里访问该输出?
最佳答案
[ClassInitialize]
和 [ClassCleanup]
只为该类中的所有测试运行一次。您最好使用在每次测试前后运行的 [TestInitialize]
和 [TestCleanUp]
。还可以尝试将完整的测试包装在数据库事务中。通过这种方式,您可以简单地回滚操作(通过不提交事务)并且您的数据库保持一致状态(这对于可信赖的自动化测试至关重要)。
我为集成测试做的一个技巧是定义一个基类,我的所有集成测试类都可以从该基类继承。基类确保每个测试都在一个事务中运行并且该事务被回滚。这是代码:
public abstract class IntegrationTestBase
{
private TransactionScope scope;
[TestInitialize]
public void TestInitialize()
{
scope = new TransactionScope();
}
[TestCleanup]
public void TestCleanup()
{
scope.Dispose();
}
}
祝你好运。
关于c# - 如何在单元测试类的 [ClassInitialize()] 中写入输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4374353/