2015-02-24 30 views
1

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

因此,我在这里的问题是:是否有可能告诉测试类最后运行?

+5

我的观点是测试应该完全独立于对方。应该避免这种依赖性。每个班级应该有自己的安装例程 – 2015-02-24 09:42:46

回答

1

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

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

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

但是在这种情况下,它听起来像你的“测试”真的是其他测试的初始化逻辑。通过在TestInitialize,ClassInitializeAssemblyInitialize中执行初始化,您应该能够使测试正确运行,而不管它们的运行顺序如何。

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。通过创建您在属性获取器中使用的类的私有实例来实现这一点。

新的实现:

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.. ] 
} 

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

相关问题