2010-04-05 7 views
6

Moq consente agli sviluppatori di simulare membri protetti. Stavo cercando la stessa funzionalità in Rhino.Mocks ma non riesco a trovarlo.Come imitare i membri virtuali protetti con Rhino.Mocks?

Ecco un esempio della pagina Moq Quick Start su come simulare il metodo protetto.

// 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); 

Fammi sapere se sto inseguendo qualcosa che non esce.

+0

È potrebbe voler controllare questo link http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx – juharr

+2

Non è proprio una soluzione adatta - dover cambiare la tua classe originale per esporre un metodo internamente ad altre classi m Si sta alterando il tuo design per far fronte ai test. Cattivo odore per me –

risposta

4

Credo che questa funzionalità non esista in Rhino Mocks.

Perché stai cercando di deridere membri protetti? Perché non testare solo la classe nel suo insieme? In alternativa puoi creare una sottoclasse della tua classe di test e creare manualmente metodi protetti "mocked".

+0

Attualmente sto sottoclassi SUT e deriso il membro protetto. Mi stavo chiedendo se c'è qualcosa come in Moq che mi avrebbe salvato dalla sottoclasse. Accetterò la tua risposta, partendo dal presupposto che Rhino.Mocks non abbia questa funzionalità. – Vadim

+0

Perché Microsoft ha cose come questa ora. ... protetto interno virtuale OkResult Ok() { } –

2

creiamo il metodo protected come internal, e quindi esporre gli elementi interni al progetto unit testing e Rhino fa beffe aggiungendo le seguenti righe al tuo AssemblyInfo:

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

funziona a meraviglia per noi

+0

keith, grazie, ma stavo cercando qualche altra soluzione, quindi modificare il mio AssemblyInfo. BTW. Circa 5 anni fa ho creato un'utilità che genera il codice InternalVisibleTo per te. Potrebbe farti risparmiare tempo. Puoi trovarlo qui: http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ – Vadim

+0

@Vadim, grazie, amico, credo che VS2012 ti permetta di prendere in giro qualsiasi cosa questo problema potrebbe non esistere per la prossima generazione di test unitari! – keith