2016-12-08 3 views
0

J'utilise Rhino Mocks pour tester la méthode suivante.Comment définir des valeurs dans GetName dans 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; 
    } 

quelque chose comme cela, mais ne savent pas comment continuer:

[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); 
     } 

    } 

Mais comment puis-je organiser des valeurs dans la méthode GetName pour le test?

Répondre

0

Vous devez utiliser simplement utiliser Repeat:
Si vous voulez la même valeur à retourner:

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

Si vous voulez des valeurs différentes à retourner:

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

merci pour votre réponse. J'ai mis à jour le code, mais rencontré une exception nullreference. S'il vous plaît voir le code mis à jour. Encore tout à fait confus au sujet de la question ... Merci – user1888955

+0

L'exception n'est pas liée à Rhino Mocks, vous avez juste besoin d'initialiser votre variable de colonnes, quelque chose comme: Liste columns = new Liste (); –

+0

merci. Je suis vraiment bête de ne pas le remarquer ... – user1888955

1

Le bon façon d'écrire votre UT est:

[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); 

} 

C'est une mauvaise pratique d'utiliser IgnoreArguments().Repeat.Once() dans ce cas, essentiellement parce que peut faire des problèmes avec la commande d'appels (et moins lisible ...), une autre option est d'utiliser la méthode Do avec List<string>.

CollectionAssert fournit la meilleure fonctionnalité pour vérifier la valeur de retour.

BTW; vous n'avez pas initialisé le columns à la nouvelle instance