如何在Unit Test类的[ClassInitialize()]中编写输出?

tsi*_*lar 10 c# unit-testing visual-studio-2010

我正在为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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用context.WriteLine() ...

我也试过使用具有相同结果的Console.WriteLine().

如何写入部件中的标准输出ClassInitialize以及在哪里可以访问该输出?

Ste*_*ven 17

[ClassInitialize][ClassCleanup]在该类别所有的测试只运行一次.在每次测试之前和之后,你都会更好地使用[TestInitialize][TestCleanUp]运行.还尝试在数据库事务中包装完整的测试.这样您就可以简单地回滚操作(通过不提交事务)并且数据库保持一致状态(这对于可靠的自动化测试至关重要).

我为集成测试做的一个技巧是定义一个我的集成测试类可以继承的基类.基类确保在事务中运行每个测试并回滚此事务.这是代码:

public abstract class IntegrationTestBase
{
    private TransactionScope scope;

    [TestInitialize]
    public void TestInitialize()
    {
        scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        scope.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

祝好运.