2010-05-06 12 views
0

J'ai créé un test unitaire qui teste les interactions sur ma classe ViewModel dans une application Silverlight. Pour pouvoir faire ce test, je me moque de l'interface de service, injectée dans ViewModel. J'utilise le framework Moq pour faire les moqueries.Utilisation correcte des rappels Moq selon AAA

pour pouvoir vérifier objet limité au ViewModel est converti correctement, je l'ai utilisé un rappel:

 

[Test] 
public void SaveProposal_Will_Map_Proposal_To_WebService_Parameter() 
{ 
var vm = CreateNewCampaignViewModel(); 
var proposal = CreateNewProposal(1, "New Proposal"); 

Services.Setup(x => x.SaveProposalAsync(It.IsAny<saveProposalParam>())).Callback((saveProposalParam p) => 
{ 
    Assert.That(p.plainProposal, Is.Not.Null); 
    Assert.That(p.plainProposal.POrderItem.orderItemId, Is.EqualTo(1)); 
    Assert.That(p.plainProposal.POrderItem.orderName, Is.EqualTo("New Proposal")); 
}); 

proposal.State = ObjectStates.Added; 
vm.CurrentProposal = proposal; 
vm.Save(); 
} 
 

Il fonctionne très bien, mais si vous avez remarqué, en utilisant ce mécanisme et la Assertion Une partie du test unitaire a changé de partie (Assert vient avant Agir). Y a-t-il une meilleure façon de le faire, tout en préservant l'ordre AAA correct?

Répondre

2

Je ne suis pas sûr que vous avez changé la sémantique de l'ordre AAA. Considérez l'exécution du test. Votre interface simulée ne sera pas appelée tant que l'action ne l'aura pas invoquée. Par conséquent, pendant l'exécution, votre programme suit toujours le flux Arranger, Agir et Assert. L'alternative serait d'utiliser l'injection de données et de créer une interface entre votre CampaignViewModel et le service Web qu'il utilise. Vous pouvez ensuite créer une classe dans vos UnitTests qui enregistre vos informations de paramètre et Assert sur ce membre/cette propriété de classe plutôt que d'utiliser Moq pour créer un proxy à la volée. Moq ne doit pas être utilisé pour simuler le stockage ou l'assignation. Au lieu de cela, utilisez Moq pour fournir des mécanismes et des valeurs factices pour permettre à vos tests unitaires de s'exécuter. Si l'affirmation du stockage est requise, prenez le temps de créer une classe qui contiendra vos valeurs.