J'essaie de se moquer de la classe System.Net.Sockets.sockets dans C # - J'ai essayé d'utiliser Nunit Mocks, mais il ne peut pas se moquer de classes en béton. J'ai également essayé d'utiliser des moqueurs de rhino, mais il semblait utiliser une véritable version de la classe car elle a jeté une socketException lorsque l'envoi (octet []) a été appelé. Quelqu'un a-t-il créé et utilisé avec succès une maquette de prise en utilisant un cadre moqueur? P>
5 Réponses :
Chaque fois que je rencontre ces types de problèmes avec MOQ, je finis par créer une interface à abstrait, je ne peux pas vous moquer de la chose.
Donc, dans votre instance, vous pourriez avoir une interface isockante qui implémente la méthode d'envoi. Alors faites votre frame moqueur qui se moque plutôt. P>
Dans votre code actuel, vous auriez une classe comme celle-ci p> Je ne sais pas si cela répond à votre besoins, mais c'est une option. P> p>
Vous devriez envisager de faire la méthode d'envoi virtuelle aussi :)
Bon appel. Édité pour faire une méthode d'envoi virtuelle.
Mais ne vous arrêtez pas là-bas. Plutôt que de faire écho à l'API externe, écrivez une interface décrivant ce que votre code veut de la couche de communication. Cela pourrait signifier qu'elle accepte une entrée plus structurée, plutôt que des octets. Ou quelque chose d'autre, cela dépend du contexte.
Mais si vous apportez cette interface plus compliquée, vous devrez le tester unit, ce qui signifie que nécessaire pour se moquer de se moquer des composants internes ... une sorte de défaite le but.
J'ai écrit du code pour générer automatiquement un assemblage avec de telles interfaces et procurations (pour des méthodes et des types scellés / statiques). Voir JOGT.CODEPLEX.COM/... pour plus d'informations.
Modification de l'interface est une chose parfaitement acceptable à faire. C'est ce qu'on appelle le motif de l'adaptateur. Et oui, le code à l'intérieur de l'adaptateur (qui traduit l'entrée structure dans le réseau d'octets) devra être testé unitaire. Mais, en réalité, ce code ne devrait pas faire partie de la classe de l'adaptateur. Il devrait plutôt s'agir d'une classe de convertisseur avec ses propres tests d'unité. La classe Adapter devient alors un client du code testé. (N'oubliez pas que c'est seulement nécessaire de tester ce qui pourrait échouer. La ligne de code unique dans l'adaptateur à appeler le convertisseur n'est peut-être pas la peine d'effort.)
Vous feriez mieux de créer une interface et de vous moquer de votre test et de mettre en œuvre une classe wrapper dans votre code, qui transfère tous les appels de méthode vers la prise .NET comme Thinkzig. Regardez ce lien, c'est le même problème: Comment vous moquez-vous du système de fichiers en C # pour les tests de l'unité? P>
La raison pour laquelle vous obtenez une socketException lorsque vous appelez la méthode d'envoi est parce que l'envoi n'est pas une méthode ultérieure. Pour que les rhinomocks puissent se moquer du comportement d'une propriété ou d'une méthode, il doit soit être défini dans une interface (que nous créons ensuite notre maquette) ou est excitée. P>
Votre seule solution à ceci est de créer une classe d'emballage moquible (comme suggéré par Thinkzig). P>
J'ai créé une application d'exemple de console à l'aide de la méthode Thinkzig suggère (une classe d'adaptateur pour la prise). Il utilise Rhinomocks et Nunit. Vous pouvez le télécharger ici: Comment simuler System.net.Sockets.socket . P>
La classe ci-dessus ne se moque que de votre méthode d'envoi. Cela se moque en fait d'une prise. Il hérite de toute la prise et implémente ensuite l'interface Isocket. Isocket doit mettre en œuvre les signatures de toutes les méthodes de prise ou des propriétés dont vous avez besoin pour simuler l'interface ressemble à ceci avec deux méthodes refusées: p> [Test]
public void NewSocketFactoryCreatesSocketDefaultConstructor()
{
webRequestFactory = new HTTPRequestFactory3();
Assert.NotNull(webRequestFactory._socket);
Socket testSocket = webRequestFactory._socket as Socket;
Assert.IsInstanceOf<Socket>(testSocket);
}
Est-ce que "vous appelez-vous une prise?" compter? =]