c# - 如何在单元测试类的 [ClassInitialize()] 中写入输出?

标签 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

我正在尝试使用 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/

相关文章:

c# - Oauth2 使用 ASP .net core MVC 登录 Google api

c# - UWP 奇数和偶数元素 ListBoxItem 的不同样式

unit-testing - 适用于小型公司和应用程序的真实单元测试

c# - Visual Studio 设计器不会为 `List<T>` 的 `Windows.Forms.Control` 成员生成代码

c++ - CMake 安装项目不会将我的可执行文件复制到我指定的文件夹

c# - 接口(interface)实例

android - Android 可以使用标准构建的 JAR 文件吗?

c# - Assert.AreEqual 与 Assert.IsTrue/Assert.IsFalse

c# - VS2010扩展-代码定义窗口

c# - 我们可以使用 Putty 捕获远程屏幕(如屏幕录像机)吗?