Version mise à jour de la questionEnregistrement de l'interaction sur un point d'inflexion en utilisant un cadre de simulation. Moq
Hi.
Mon entreprise possède quelques bases de code héritées que j'espère tester dès leur migration vers .NET 3.5. J'ai choisi Moq comme mon framework Mocking (je suis tombé amoureux de la syntaxe précise immédiatement).
Un scénario courant, dont je m'attends à voir beaucoup dans le futur, est celui où je vois un objet qui interagit avec d'autres objets.
Je connais les travaux de Michael Feathers et je réussis à identifier les points d'inflexion et à isoler les composants de taille décente. Extraire et remplacer est roi.
Cependant, il y a une caractéristique qui rendrait ma vie beaucoup plus facile.
Imaginez que Component1 interagisse avec Component2. Component2 est une interface de ligne série bizarre à un centre de feu ou quelque chose avec beaucoup d'inspection d'octet, de moulage et de manipulation de pointeur. Je ne souhaite pas comprendre component2 et son interface héritée consommée par Component1 comporte beaucoup de bagages.
Ce que je voudrais faire, est d'extraire l'interface de Component2 consommée par Component1 et faire quelque chose comme ceci:
component1.FireCentral = new Mock<IComponent2> (component2);
Je crée une maquette normale, mais je suis PASING dans une instance de le réel Component2 en tant qu'argument de constructeur dans l'objet Mock. Il peut sembler que je fais mon test en fonction de Component2, mais je ne prévois pas de garder ce code. Cela fait partie du rituel «placer l'objet sous test».
Maintenant, j'allumerais le système réel (avec un centre de tir physique connecté), puis interagirais avec mon objet. Ce que je voudrais alors, est d'inspecter le mock pour voir un journal de comment component1 a interagi avec component2 (en utilisant le débogueur pour inspecter une collection de chaînes sur le faux). Et, mieux encore, le simulacre pourrait fournir une liste d'attentes (en C#) qui créeraient ce comportement dans un simulacre qui ne dépendrait pas de Component2, que j'utiliserais alors dans mon code de test.
En bref. Utilisation du cadre de simulation pour enregistrer l'interaction afin que je puisse la lire dans mon code de test.
ancienne version de la question
Salut.
En travaillant avec du code hérité et avec beaucoup de classes d'utilitaires, je me demande parfois comment une classe particulière est influencée par son environnement dans un certain nombre de scénarios. Un cas sur lequel je travaillais ce matin impliquait de sous-classer un MemoryStream régulier de sorte qu'il vidait son contenu dans un fichier lorsqu'il atteignait une certaine taille.
// TODO: Remove
private class MyLimitedMemoryStream : MemoryStream
{
public override void Write(byte[] buffer, int offset, int count)
{
if (GetBuffer().Length > 10000000)
{
System.IO.FileStream file = new FileStream("c:\\foobar.html",FileMode.Create);
var internalbuffer = GetBuffer();
file.Write(internalbuffer,0,internalbuffer.Length);
}
base.Write(buffer, offset, count);
}
}
(et j'ai utilisé un point d'arrêt ici pour quitter le programme après l'écriture du fichier). Cela a fonctionné, et j'ai trouvé quel contrôle webform (partie Web-> partie Web-> partie Web) rendu incorrectement. Cependant, le flux de mémoire a un tas d'écriture et d'écriture.Puis-je utiliser un cadre de simulation pour obtenir rapidement un aperçu de la manière dont une instance donnée est traitée? Des astuces intelligentes là-bas? Nous utilisons Rhino Mocks. Je vois cela comme un excellent moyen de travailler avec du code hérité. Surtout si les actions enregistrées dans un scénario peuvent facilement être configurées en tant que nouvelles attentes/critères d'acceptation pour ce même scénario reproduits dans un test unitaire.
Chaque contribution est appréciée. Merci pour la lecture.
Avez-vous trouvé quelque chose pour cela depuis 2009? Je le veux pour la JVM. –
Non le type de cadre moqueur qui enveloppe et enregistre le comportement d'une dépendance me échappe toujours. Il pourrait être temps pour un autre regard sérieux autour, cependant. – Tormod
Voici la même question posée pour Java. http://stackoverflow.com/questions/16400897/record-method-calls-in-one-session-for-replaying-in-future-test-sessions L'une des réponses pointe vers une mise en œuvre majeure. https://gist.github.com/dfreeman/5563829 –