2016-12-08 28 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初始化爲新實例