2016-12-08 65 views
0

我正在使用Rhino Mocks来测试以下方法。如何在IDataReader中的GetName中设置值?

public static List<string> RetrieveColumnNames(IDataReader reader) 
    { 
     List<string> columns = null; 

     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      columns.Add(reader.GetName(i)); 
     } 

     return columns; 
    } 

有这样的事情,但不知道如何继续:

[TestMethod()] 
    public void RetrieveColumnNamesTest() 
    { 
     //Arrange 
     IDataReader reader = MockRepository.GenerateStub<IDataReader>(); 

     reader.Stub(x => x.FieldCount).Return(2); 
     reader.Stub(x => x.name...) // not gonna happen 

     //Act 
     using (reader) 
     { 
      List<string> list = RetrieveColumnNames(reader); 

      //Assert 
      Assert.AreEqual(2, list.Count); 
     } 

    } 

但我怎么能安排方法GetName值测试?

回答

0

你应该使用简单的使用Repeat
如果你想被返回的值相同:

reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Any().Return("My Name"); 

如果你想返回不同的值:

reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Once().Return("First Name"); 
reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Once().Return("Second Name"); 
+0

感谢您的回答。我更新了代码,但遇到nullreferenceexception。请参阅更新的代码。还是很关心这个问题......谢谢 – user1888955

+0

这个异常与Rhino Mocks无关,你只需要初始化你的列变量,如下所示:List columns = new List (); –

+0

谢谢。我真的很愚蠢,因为没有注意到... – user1888955

1

正确写你的UT的方法是:

[TestMethod] 
public void TestMethod1() 
{ 
    const string FIRST = "First Name"; 
    const string SECOND = "Second Name"; 

    var reader = MockRepository.GenerateStub<IDataReader>(); 

    reader.Stub(x => x.FieldCount).Return(2); 
    reader.Stub(x => x.GetName(0)).Return(FIRST); 
    reader.Stub(x => x.GetName(1)).Return(SECOND); 

    var actual = RetrieveColumnNames(reader); 

    CollectionAssert.AreEquivalent(new [] {FIRST, SECOND}, actual); 

} 

在这种情况下使用IgnoreArguments().Repeat.Once()是一种不好的做法,主要是因为可能会导致呼叫排序问题(并且其可读性较差......),另一个选择是使用Do方法与List<string>

CollectionAssert提供了验证返回值的最佳功能。

BTW;您没有将columns初始化为新实例