2009-07-24 7 views
4

Essayer de comprendre l'utilisation de verifySet etc ... mais à moins que je ne contourne une solution, je ne peux pas le faire fonctionner. Est-ce que quelqu'un peut clarifier comment je devrais utiliser VerifySet et Verify et VerifyGet sur une propriété? Je suis confus.Invocation Moq n'a pas été effectuée sur le simulacre

Répondre

9

Vous devez effectuer une action avant d'appeler vérifier. Le paradigme de test unitaire typique avec des objets fantaisie est:

// Arrange 
// Act 
// Assert 

Alors ce qui suit est une mauvaise utilisation parce que vous manquez votre étape de loi:

public void Can_do_something() 
{ 
    // Arrange 
    var newProduct = new Mock<IProduct>(); 
    newProduct.SetupGet(p => p.Name).Returns("Jo"); 

    // Act - doesn't exist! 
    // Your action against p.Name (ie method call), should occur here 

    // Assert 
    // This fails because p.Name has not had an action performed against it 
    newProduct.VerifySet(p => p.Name, Times.AtLeastOnce()); 
} 

Et cela est exact, car il existe loi:

public void Can_do_something() 
{ 
    // Arrange 
    var newProduct = new Mock<IProduct>(); 
    newProduct.SetupGet(p => p.Name).Returns("Jo"); 

    // Act 
    LoadProduct(newProduct.Object); 

    // Assert 
    newProduct.VerifySet(p => p.Name, Times.AtLeastOnce()); 
} 

public static void LoadProduct(IProduct product) 
{ 
    product.Name = "Jo"; 
} 

test du modèle suit un modèle différent que les tests non-Mock connu sous le nom Comportement de vérification - c'est un answer J'ai fait cela clarifiera un peu plus le concept.

1

Arranger:

Demandez des objets simulacres ce qui va se passer lors de l'essai. Dites-lui quels événements vont se déclencher, quelles méthodes et propriétés seront utilisées, et que faire quand ces choses arriveront.

Loi:

exercice le code en cours de test.

Assertion:

Demandez aux objets fantaisie si ce que vous leur avez dit d'attendre réellement passé. Inspectez également votre code pour voir si cela a fonctionné comme prévu.

Votre problème est que vous avez arrangé, puis affirmé sans agir entre. La série de méthodes Verify affirme que ce que vous avez dit se produirait dans les méthodes d'installation.

2

Vous utilisez VerifySet() de la manière correcte, vous avez juste omis la scène // loi du

typique
//Arrange 

//Act 

//Assert 

construction d'essai. Comme vous l'avez suggéré, l'insertion

newProduct.Object.Name = "Jo"; 

dans votre étape // Act résout le problème. VerifyGet() sera utilisé exactement de la même manière, par exemple,

NewProduct.Verify() est utilisé pour vérifier toute action spécifiée, par ex.

//Arrange 
var newProduct = new Mock<IProduct>(); 
newProduct.SetupGet(p => p.Id).Returns(1); 
newProduct.SetupGet(p => p.Name).Returns("Jo"); 

//Act 
newProduct.Object.SomeMethodYouDefineOnTheProductObject(); 

//Assert 
newProduct.Verify(p => p.SomeMethodYouDefineOnTheProductObject(), Times.AtLeastOnce()); 
0

Merci les gars Malheureusement, je suis nouveau à tout cela et essayer d'apprendre rapidement.En particulier, la terminologie « acte » « organiser » etc

Alors même si je ne comprenais pas ce que je faisais, je l'ai fait correctement comme

newProduct.Object.Name = « Jo »;

était en train d'établir un acte.

gars explication fantastique merci beaucoup

Une dernière chose que je pensais que ce serait « mis en place et agir », mais ce n'est pas le cas correct est-il? connaissez-vous le diff aussi bien entre les deux SetupProperty et SetupSet/Get

mock.SetupProperty (f => f.Nom, "foo");

mock.SetupSet (foo => foo.Surname = "foo");

Questions connexes