Ich habe die folgende Methode, die ich mit Moq testen muss. Das Problem ist, dass jede in der switch-Anweisung aufgerufene Methode privat ist, einschließlich der PublishMessage am Ende. Aber diese Methode (ProcessMessage) ist öffentlich. Wie kann ich das testen, damit ich sicherstellen kann, dass die Anrufe abhängig vom Parameter getätigt werden? Beachten Sie, dass ich die privaten Methoden nicht testen möchte, ich möchte nur die "Anrufe" testen. Ich möchte diese privaten Methoden nachahmen und prüfen, ob sie mit Setup aufgerufen werden, aber Moq unterstützt keine privaten Methoden.
%Vor%Sie müssen diese privaten Methoden zu mindestens geschützten virtuellen ändern, um sie zu verspotten und dann mock.Protected verwenden, um sie zu verspotten ( Ссылка ). Sie können private Methoden nicht vortäuschen.
Moq (und einige andere Frameworks) verwenden den DynamicProxy von Castle Project, um während der Laufzeit Proxies zu generieren, sodass die Mitglieder eines Objekts abgefangen werden können, ohne den Code der Klasse zu ändern. Diese Überwachung kann nur mit öffentlichen virtuellen und geschützten virtuellen Methoden durchgeführt werden.
Siehe URL für weitere Informationen: Ссылка
Moq dient dazu, Eigenschaften und Methoden, die in Interfaces deklariert sind, und / oder abstrakte Eigenschaften und Methoden in Klassen zu verspotten.
Die Idee hinter Moq-Testing besteht darin, dass Sie die Interaktionen zwischen Ihrer getesteten Klasse und dem Rest der Welt (ihren Abhängigkeiten) testen. Moq tut dies, indem er eine "verspottete" Implementierung der Schnittstelle oder eine Ableitung der abstrakten Klasse mit den implementierten abstrakten Methoden erstellt.
Moq kann die vorhandene Implementierung nicht wie Ihre privaten Methoden überschreiben. So funktioniert Moq nicht.
Entweder sollten Sie "ProcessMessage" mit allen möglichen Eingaben und erwarteten Ausgaben testen oder Sie sollten Ihre Klasse umgestalten, um die Aufrufe an Schnittstellenmethoden zu delegieren, die Sie mit Moq überspielen können. Private Methoden zu testen ist sowieso ein schlechtes Konzept. Sie werden aus einem Grund privat gehalten, um die Implementierung so zu verbergen, dass sie sich nach Belieben ändern kann.
Ich bevorzuge es, zusätzliche Klassen (* Helper) hinzuzufügen und alle meine privaten Methoden öffentlich zu machen. Dann können Sie Ihre Methoden einfach direkt testen. Ich habe keinen eleganteren Weg gefunden, das zu tun.
Tags und Links moq