2016-12-08 13 views
0

Я использую Rhino Mocks для тестирования следующего метода.Как установить значения в GetName в IDataReader?

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

спасибо за ваш ответ. Я обновил код, но встретил исключение nullreference. См. Обновленный код. Все еще довольно запутано в проблеме ... Спасибо – user1888955

+0

Исключение не связано с Rhino Mocks, вам просто нужно инициализировать переменную столбцов, например: Список columns = new Список (); –

+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 для нового экземпляра