C# 初始化C类#
启动类并将该初始化保存在变量中以供其他方法使用而不是每次启动的最佳方法是什么 这是我的密码:C# 初始化C类#,c#,unit-testing,tdd,mstest,C#,Unit Testing,Tdd,Mstest,启动类并将该初始化保存在变量中以供其他方法使用而不是每次启动的最佳方法是什么 这是我的密码: private Employee employee; public Employee SystemUnderTest { get { if (employee == null) { employee = new Employee(); } return employee; } } //..method1 Te
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框架。静态初始化应该可以工作。 这将在您首次访问该类型时运行,并且共享变量将可用于所有实例
private static bool m_HasInitialized = false;
private static MyClassName()
{
// Do Stuff...
m_HasInitialized = true;
}
如果我正确理解了您的问题,请在测试类中创建一个私有字段来保存包含初始化信息的变量,然后使用带有[TestInitialize]或[TestSetUp]属性(取决于您的测试框架)的方法来初始化信息。这将使您的所有测试方法都可以看到私有字段,但是您只需要在一个地方定义初始化。这还有一个额外的好处,即为每个测试方法重新初始化变量,这样,如果一个测试意外地改变了变量的状态,就不会导致其他测试中断
但是,如果您确实希望初始化只发生一次(而不是只定义一次代码),请使用[TestFixtureSetUp]或[ClassInitialize]属性。您可以在类静态构造函数中初始化静态字段,也可以使用
[ClassInitialize]
单元测试属性,用于标记要在该单元测试类中的任何测试方法执行之前执行的方法
这里有更多信息:单例模式(一种变体,延迟初始化):
您的测试方法应该相互独立。在C#/.NET中,对象创建速度非常快。你看到一些性能问题了吗?不是真的,但我认为不初始化的唯一原因是因为我有一个从外部源读取数据的基类。你使用的是什么单元测试框架?NUnit,XUnit,mstest?当运行单元测试时,不应该有任何外部IO。否则,它们不是单元测试,而是集成测试。我建议您模拟代码中涉及外部数据的部分。请查看有关使用外部数据进行单元测试的讨论。如果测试正在修改Employee实例,则运行特定测试方法时该实例的状态将取决于以前运行的测试。@petarepac这是一件坏事,因为测试可以以任何顺序运行。可能OP不使用mstest?我没有考虑过
ClassInitialize
我会尝试一下。我尝试过ClassInitialize属性,但当我运行测试时,它显示所有测试都跳过了。。。我的所有测试都没有运行。。知道吗?为什么懒惰?这是没有必要的。这会使代码复杂化,初始化代码最终也会被调用。。。;我确实尝试了ClassInitialize
属性,但当我运行测试时,它显示所有测试都已跳过。。。我的所有测试都没有运行。。有什么想法吗?——您熟悉在当前上下文或解决方案中运行或调试测试的区别吗?你会希望确保采取正确的行动。如果您已经了解了所有这些,那么有时您可以创建测试列表,通过VisualStudio中的“测试”菜单进行管理,并且可能已经定义了一些不充分的测试集,其中不包括任何您想要运行的测试。不过,我现在正在深入猜测。
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;
}
}
}