是否可以告诉Testclass它应该运行到最后?

时间:2015-02-24 09:32:09

标签: c# unit-testing visual-studio-2013

我在单元测试项目(visual studio unit test project)中编写了多个类,除了一个类之外它工作正常。由于我如何获取数据库访问的连接字符串(我以某种方式获取它以便它只在程序启动时定义一次而不再重新获得)包含此例程的测试类会妨碍所有其他单元测试类在它们的功能中,如果它在它们之前运行。

因此我的问题是:是否可以告诉测试类最后运行?

3 个答案:

答案 0 :(得分:1)

这听起来像是次优的设置。您是否尝试在使用[AssemblyInitialize]属性标记的初始化方法中进行必要的设置? 它将在项目中的所有其他测试类之前运行。请注意,方法的签名必须如下所示,并且必须放在使用[TestClass]属性修饰的类中。

[AssemblyInitialize]
public static void Setup(TestContext context)
{
    // Store data in static variables, initialize database connection etc.
}

答案 1 :(得分:0)

不 - 测试类只是一个包含单元测试的类。它没有关于应该运行什么顺序的信息。如果要控制测试运行的顺序,可以考虑使用ordered test

在这种情况下,听起来你的“测试”实际上是其他测试的初始化逻辑。通过在TestInitializeClassInitializeAssemblyInitialize中进行初始化,无论运行顺序如何,您都应该能够正确运行测试。

答案 2 :(得分:0)

  

(我正在以某种方式获取它,以便它只会在程序启动时定义一次而不会再次获得)

所以你使用的是静态类/属性,呵呵?

这样的事情:

public class ConnectionStringProvider
{
    private static string _connectionString;

    public static string ConnectionString
    {
        get 
        { 
            if (_connectionString == null)
                _connectionString = LoadConnectionString();
            return _connectionString; 
        }
    }

    private static void LoadConnectionString()
    {
        //fetch it from somewhere
    }

}

在不改变行为的情况下使其可测试的最简单方法是将API与实现分开。通过创建在属性getter中使用的类的私有实例来实现。

新实施:

public class ConnectionStringProvider
{
    private static ConnectionStringProvider _instance;
    private string _connectionString;

    public static string ConnectionString
    {
        get 
        { 
            if (_instance == null)
            {
                _instance = new ConnectionStringProvider();
                _instance.LoadConnectionString();
            }

            return _instance._connectionString; 
        }
    }

    private void LoadConnectionString()
    {
        //fetch it from somewhere
    }

}

通过这样做,您可以在自己的测试中创建类的新实例,而无需更改静态属性:

在您的商家代码中:

var conStr = ConnectionStringProvider.ConnectionString;

在您的测试方法中:

[Fact]
public void load_connection_if_not_accessed_previously
{

    var sut = new ConnectionStringProvider();
    // [.. test here.. ]
}

这样你仍然可以在不影响其他测试的情况下测试实现。