2016-06-08 88 views
-2

我正在VS2015中设置自定义类的单元测试。我发现在同一个类上运行两种测试方法时看起来很奇怪。这里的问题简单化:对象的新实例实际上是重用现有对象

public MyClass 
{ 
    private List<string> _MyList = new List<string>(); 
    public void AddItem(string s) 
    { 
     _MyList.Add(s); 
    } 
    public List<string> GetList() 
    { 
     return _MyList; 
    } 
} 

[TestMethod] 
public void AddSingleItem() 
{ 
    MyClass instance = new MyClass(); 
    instance.AddItem("string 1"); 
    Assert.AreEqual(1, instance.GetList().Count); 
} 

[TestMethod] 
public void AddMultipleItems() 
{ 
    MyClass instance = new MyClass(); 
    instance.AddItem("string 1"); 
    instance.AddItem("string 2"); 
    Assert.AreEqual(2, instance.GetList().Count); 
} 

的问题是,第一次测试通过的罚款,并在自身运行第二个测试通过罚款,但如果一起运行第二次测试失败说断言预期,实际是不同的,好像方法是将字符串添加到同一个对象(尽管创建了它的新实例)。

我添加了一个构造函数来确保_MyList在实例化时被清除,这解决了问题,但我想知道这是否是预期的,为什么?不得不让你的默认构造函数清除你所有的属性是否是标准做法?看起来很奇怪,new MyClass()实际上并没有产生一个全新的实例。

以供参考,这是我提到的构造:

public MyClass() 
{ 
    _MyList.Clear(); 
} 
+0

您发布的代码是否显示您正在讨论的行为,或者您是否简化了它,然后不运行测试? – StriplingWarrior

+0

我没有完全测试这段代码,但它包含了单元测试中涉及的所有部分。我会快速地嘲笑它,以确保它可以通过此代码重现。 – thanby

+2

请再次阅读[MCVE]指导。发布一些与您遇到问题无关的代码是没有意义的。 –

回答

2

没有理由让你与你发布的代码描述行为。我猜测,在你简化问题的时候,你改变了一些至关重要的东西。最有可能的是,你的私人领域:

private List<string> _MyList = new List<string>(); 

可能是静态的:

private static List<string> _MyList = new List<string>(); 

这将导致你的类的每个实例重复使用同一个实例。添加一个重置此值的构造函数会给出修复问题的外观,但是它会导致更多问题,因为创建的第一个实例会在每次创建新实例时重置其列表。你可能会开始看到难以追踪的奇怪的比赛条件,等等。

如果是这种情况,确保该字段不是static应该修复。

+0

Derp。确切的问题。只要计时器允许,我会尽快接受。 – thanby