2010-03-17 16 views
30

Come posso fare questo in Moq?Come simulare una chiamata di funzione su un oggetto concreto con Moq?

Foo bar = new Foo(); 
Fake(bar.PrivateGetter).Return('whatever value') 

Sembra che riesca solo a trovare come imitare un oggetto creato tramite il framework. Voglio prendere in giro solo un singolo metodo/proprietà su un oggetto concreto che ho creato.

In TypeMock, vorrei fare solo Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value').

Qualche idea?

risposta

13

Solo TypeMock Isolator (e forse Moles) può eseguire queste acrobazie. Le normali librerie di simulazioni dinamiche possono only mock virtual and abstract members.

+0

Buono a sapersi - vorrei che ci fossero più informazioni su Moles là fuori - non ho ancora sentito nulla su di esso per quanto riguarda le persone che lo utilizzano qui su SO – dferraro

+0

FWIW, ecco il sito ufficiale: http: // research. microsoft.com/en-us/projects/moles/ –

+0

Quel Moq non può farlo semplicemente non è più vero. – MushinNoShin

51

È necessario utilizzare Moq per creare l'oggetto Mock e impostare la proprietà CallBase su true per utilizzare il comportamento dell'oggetto.

Dalla documentazione Moq: CallBase è definito come "Richiama l'implementazione della classe base se nessuna attesa sostituisce il membro. Questo è chiamato "Partial Mock". Permette di deridere certe parti di una classe senza dover prendere in giro tutto.

codice di esempio:

[Test] 
    public void FailintgTest() 
    { 
     var mock = new Moq.Mock<MyClass>(); 
     mock.Setup(m => m.Number).Returns(4); 
     var testObject = mock.Object; 
     Assert.That(testObject.Number, Is.EqualTo(4)); 
     Assert.That(testObject.Name, Is.EqualTo("MyClass")); 
    } 

    [Test] 
    public void OKTest() 
    { 
     var mock = new Moq.Mock<MyClass>(); 
     mock.Setup(m => m.Number).Returns(4); 
     mock.CallBase = true; 
     var testObject = mock.Object; 
     Assert.That(testObject.Number, Is.EqualTo(4)); 
     Assert.That(testObject.Name, Is.EqualTo("MyClass")); 
    } 

    public class MyClass 
    { 
     public virtual string Name { get { return "MyClass"; } } 

     public virtual int Number { get { return 2; } } 
    } 
+0

Grazie, ci proverò. Rende TypeMock sempre più allettante. Ugh! – dferraro

+1

Questo non ha funzionato - ha dato un messaggio di errore sulla riga mock.Setup() (nel secondo esempio) "Metodo di prova CRMFundOfFundPluginsUnitTest.FoFPluginBaseTest.SetMissingTargetValuesTest1 ha gettato un'eccezione: System.ArgumentException: impostazione non valida su un membro non sostituibile: m => m.InputTargetDE. ". Qualche idea del perché? – dferraro

+6

Assicurati che i metodi che stai prendendo in giro siano virtuali, quindi Moq sarà in grado di sovrascriverli. –

3

Talpe può anche sostituire i metodi privati ​​fino a quando i tipi sulla firma sono visibili. Quindi, in questo caso, sarebbe simile a questa:

MFoo bar = new MFoo { // instantiate the mole of 'Foo' 
    PrivateGetterGet =() => "whatever value" // replace PrivateGetter {get;} 
}; 
Foo realBar = bar; // retrive the runtime instance 
... 

Se siete alla ricerca di maggiori informazioni su Moles, iniziare con le esercitazioni a http://research.microsoft.com/en-us/projects/pex/documentation.aspx.

Problemi correlati