2010-04-05 14 views
6

Moq ermöglicht es Entwicklern, geschützte Mitglieder nachzuahmen. Ich suchte nach der gleichen Funktionalität in Rhino.Mocks, aber finde es nicht.Wie man geschützte virtuelle Mitglieder mit Rhino.Mocks vortäuscht?

Hier ist ein Beispiel aus Moq Quick Start Seite, wie geschützte Methode zu mock.

// at the top of the test fixture 
using Moq.Protected() 

// in the test 
var mock = new Mock<CommandBase>(); 
mock.Protected() 
    .Setup<int>("Execute") 
    .Returns(5); 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<string>("Execute", 
     ItExpr.IsAny<string>()) 
    .Returns(true); 

Lassen Sie mich wissen, wenn ich etwas jage, das nicht austritt.

+0

Sie Vielleicht möchten Sie diesen Link http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx – juharr

+2

Das ist nicht wirklich eine geeignete Lösung - Sie müssen Ihre ursprüngliche Klasse ändern, um eine Methode intern für andere Klassen verfügbar zu machen. M Sie ändern Ihr Design, um es zu testen. Schlechter Geruch für mich. –

Antwort

4

Ich glaube, dass diese Funktionalität in Rhino Mocks nicht existiert.

Warum versuchen Sie, geschützte Mitglieder zu verspotten? Warum nicht einfach die Klasse als Ganzes testen? Alternativ können Sie eine Unterklasse Ihrer Testklasse erstellen und "mocked" geschützte Methoden manuell erstellen.

+0

Ich bin derzeit Unterklasse SUT und Mock das geschützte Mitglied. Ich habe mich gefragt, ob es so etwas wie in Moq gibt, das mich davor bewahren würde, Unterklassen zu bilden. Ich nehme Ihre Antwort an und nehme an, dass Rhino.Mocks nicht über diese Funktionalität verfügt. – Vadim

+0

Weil Microsoft solche Dinge jetzt hat. ... geschützt intern virtuell OkResult Ok() { } –

2

Wir schaffen die protected Methode als internal, und dann die Interna des Projekts Unit-Tests aussetzen und Rhino Mocks, indem Sie die folgenden Zeilen in Assembly hinzu:

[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

für uns ein Vergnügen arbeitet

+0

keith, danke, aber ich war auf der Suche nach einer anderen Lösung, dann meine AssemblyInfo ändern. BTW. Vor ungefähr 5 Jahren habe ich ein Dienstprogramm erstellt, das InternalVisibleTo-Code für Sie generiert. Es könnte dir Zeit sparen. Sie können es hier finden: http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ – Vadim

+0

@Vadim netter Dank Mann, ich glaube, VS2012 können Sie alles so spotten Dieses Problem besteht möglicherweise nicht für die nächste Generation von Komponententests! – keith

Verwandte Themen