2012-08-08 77 views
0

当我运行一个单元测试时,我不断收到空对象引用错误。使用NUnit进行单元测试。空对象错误

单元测试:

[Test] 
    public void EnumeratedData_ValidInputType_NoErrorAdded() 
    { 
     List<String> errorMessageList = new List<string>(); 
     UserInputEntity myEntity = new UserInputEntity(); 

     myEntity.DataTypes = new List<string>(); 
     myEntity.DataTypes.Add("DateTime"); 
     myEntity.DataTypes.Add("datetime"); 
     myEntity.DataTypes.Add("decimal"); 
     myEntity.DataTypes.Add("decIMAL"); 
     myEntity.DataTypes.Add("DOUble"); 
     myEntity.DataTypes.Add("double"); 
     myEntity.DataTypes.Add("FLOat"); 
     myEntity.DataTypes.Add("float"); 
     myEntity.DataTypes.Add("INT"); 
     myEntity.DataTypes.Add("int"); 

     PathReader reader = new PathReader(); 
     IOManager manager = new IOManager(reader); 
     VerificationManager testObject = new VerificationManager(manager); 

     testObject.EnumeratedDataTypes(myEntity, errorMessageList); 
     Assert.AreEqual(errorMessageList.Count, 0); 
    } 

方法代码:

public void EnumeratedDataTypes(UserInputEntity inputs, List<String> errorMessageList) 
    { 
     inputs.EnumeratedDataTypes = new int[inputs.DataTypes.Count]; 
     try 
     { 
      for (int i = 0; i < inputs.DataTypes.Count; i++) 
      { 
       inputs.EnumeratedDataTypes[i] = (int)Enum.Parse(typeof(Enumerations.ColumnDataTypes), inputs.DataTypes[i].ToUpper()); 
      } 
     } 
     catch (Exception ex) 
     { 
      errorMessageList.Add(ex.Message); 
     } 
    } 

枚举:

class Enumerations 
{ 
    public enum ColumnDataTypes 
    { 
     DATETIME = 0, 
     DECIMAL = 1, 
     DOUBLE = 2, 
     FLOAT = 3, 
     INT = 4 
    } 
} 

的ErrorMessage:

˚F razerMann.CsvImporter.Entity.Test.EntityVerificationTests.EnumeratedData_ValidInputType_NoErrorAdded: System.NullReferenceException:未将对象引用设置为对象的实例。

即时通讯im我忽略了一些愚蠢简单的东西,但我无法看到它。如果有人能够让我摆脱我的痛苦,我很欣赏它。

回答

1

在你EnumeratedDataTypes方法中,首先设定inputs.EnumeratedDataTypes属性的长度inputs.ColumnNames.Count,因为它并没有被填满的数据尚未等于0(这仅仅是List容量已被设置为9 )。

接着,数据从0填充此数组属性时循环到索引(包括)inputs.DataTypes.Count

for (int i = 0; i <= inputs.DataTypes.Count; i++) 

予算input.DataTypes列表的大小来10。因此,您将尝试将数据写入空数组。

我提出以下的变化:

首先,如下初始化inputs.EnumeratedDataTypes数组:

inputs.EnumeratedDataTypes = new int[inputs.DataTypes.Count]; 

,在for循环使用<代替<=

for (int i = 0; i < inputs.DataTypes.Count; i++) 
+0

@Andres you beat me to the answer。只是一个澄清,计数实际上是0,因为该列表尚未被使用。 – JTMon 2012-08-08 14:41:19

+0

@JTMon你说得对,对不起!它当然是在构造函数中设置的'List' _capacity_,而不是预定义的_size_。将相应地更新我的回复。 – 2012-08-08 14:50:16

+0

安德斯,欢呼声回复。关于<=和初始化的好处。不幸的是,它仍然说我有一个相同类型的错误。我用他更新的代码编辑我的原始问题。 +1虽然:) – 2012-08-08 14:54:40