2009-06-12 2 views
1

J'utilise la bibliothèque Moq. Je me moque d'une instance qui fait toutes les fonctionnalités régulières de CRUD. Je voudrais le configurer de manière à autoriser un seul appel Delete (x) sur un objet et tous les appels consécutifs à Delete (x) du même objet devraient renvoyer une exception.Comment configurer un objet fantaisie pour retourner un résultat au premier appel et Exception pour le reste

Ma méthode Delete() renvoie void.

Comment faire cela?

Certains Code

mock = new Mock<ITest>(); 
mock.Setup(m => m.Delete(1)); 
mock.Setup(m => m.Delete(3)).Throws<Exception>(); 
... 

Répondre

4

Laissez-le parler de code :-)

public interface ITest 
    { 
     void Delete(int x); 
    } 

    [TestMethod] 
    [ExpectedException(typeof(InvalidOperationException))] 
    public void TestMethod1() 
    { 
     HashSet<int> deleted = new HashSet<int>(); 

     var mock = new Mock<ITest>(); 
     mock.Setup(m => m.Delete(It.Is<int>(x => deleted.Contains(x)))) 
      .Throws(new InvalidOperationException("already deleted")); 
     mock.Setup(m => m.Delete(It.Is<int>(x => !deleted.Contains(x)))) 
      .Callback<int>(x => deleted.Add(x)); 

     mock.Object.Delete(1); 
     mock.Object.Delete(1); 
    } 
+0

très belle astuce à fait. –

0

ne peut pas vous faire quelque chose comme (syntaxe exacte peut être hors de la mémoire):

mock.Expect(m => m.Delete(1)).Times.Exactly(1); 
+1

Expect est maintenant obsolète et "Setup" devrait être utilisé à la place. Mais il n'y a pas de méthode Times/propriété que je pourrais appeler ... :( –

Questions connexes