初始化C#

时间:2012-10-09 22:49:07

标签: c# unit-testing tdd mstest

启动类并在变量中保存初始化以供其他方法使用而不是每次启动的最佳方法是什么。

这是我的代码:

private Employee employee;
public Employee SystemUnderTest
{
   get 
   {
       if (employee == null)
       {
          employee = new Employee();
       }
      return employee;
   }
}

//..method1 Test1
   public void TestMethod1()
   {
     Assert.IsTrue(SystemUnderTest.IsActive());
   }

   //..method2 Test   
   public void TestMethod2()
   {
     Assert.IsTrue(SystemUnderTest.IsEmployeeExists());
   }

PS:调试时我发现它确实用每种方法初始化了Employee对象。

使用3.5框架。

4 个答案:

答案 0 :(得分:0)

静态初始化应该有效。 这将在您第一次访问该类型时运行,共享变量将可用于所有实例。

private static bool m_HasInitialized = false;

private static MyClassName()
{
    // Do Stuff...
    m_HasInitialized = true;
}

答案 1 :(得分:0)

如果我正确理解您的问题,请在测试类中创建一个私有字段来保存包含初始化信息的变量,然后使用[TestInitialize]或[TestSetUp]属性修饰的方法(取决于您的测试)框架)初始化信息。这将为您的所有测试方法提供对私有字段的可见性,但您只需在一个位置定义初始化。这还有一个额外的好处,就是为每个测试方法重新初始化变量,这样如果一个测试意外地改变了变量的状态,它就不会导致其他测试中断。

但是如果你真的希望初始化只发生一次(而不是仅仅定义一次代码),请使用[TestFixtureSetUp]或[ClassInitialize]属性。

答案 2 :(得分:0)

您可以在类静态构造函数中初始化静态字段,或者可以使用[ClassInitialize] *单元测试属性来标记要在该单元测试类中的任何测试方法之前执行的方法执行。

此处有更多信息:Do you use TestInitialize or the test class constructor to prepare each test? and why?

答案 3 :(得分:0)

单例模式(变体之一,延迟初始化):

public class Singleton
{
    private readonly static object _lockObject = new object();
    private static Singleton _instance;

    public static Singleton Instance {
        get
        {
            if (_instance == null)
            {
                lock (_lockObject)
                {
                    if (_instance == null)
                        _instance = new Singleton();
                }
            }
            return _instance;
        }
    }
}