2009-12-28 2 views

risposta

5

È possibile prendere in giro qualsiasi interfaccia e qualsiasi membro astratto o virtuale. Questo è fondamentalmente.

Ciò significa che i seguenti sono assolutamente possibile:

var imock = new Mock<IMyClass>(); 
var aMock = new Mock<SomeAbstractClass>(); 

Se i membri ereditati dal SomeAbstractClass non sono sigillati, è anche possibile MyClass finto:

var mcMock = new Mock<MyClass>(); 

Se questo ha un senso oppure no dipende dall'implementazione di MyClass. Diciamo che SomeAbstractClass è definita in questo modo:

public abstract class SomeAbstractClass 
{ 
    public abstract string GetStuff(); 
} 

Se il metodo GetStuff in MyClass è implementato in questo modo, si può ancora ignorare che:

public override string GetStuff() 
{ 
    return "Foo"; 
} 

Questo permetterebbe di scrivere:

mcMock.Setup(x => x.GetStuff()).Returns("Bar"); 

poiché se non esplicitamente sigillato, GetStuff è ancora virtuale. Comunque, hai scritto GetStuff in questo modo:

public override sealed string GetStuff() 
{ 
    return "Baz"; 
} 

Non saresti in grado di deriderlo. In tal caso, si otterrebbe un'eccezione da Moq che indica che si tratta di una sovrascrittura non valida di un membro non virtuale (poiché ora è sealed).

0

La tua domanda non ha molto senso. Moq può essere usato per deridere classi astratte e interfacce. Dal momento che MyClass non è né quindi non è possibile creare una simulazione di esso. Tuttavia, non penso che questo sia un problema, dal momento che i consumatori dell'istanza MyClass probabilmente si aspettano un'istanza SomeAbstractClass o IMyClass e non un'istanza MyClass. Se in effetti si aspettano un'istanza MyClass, è necessario creare un'astrazione su di essa. Ciò può essere ottenuto mediante SomeAbstractClass o con l'interfaccia IMyClass oppure l'interfaccia IMyClass espone i metodi e le proprietà di SomeAbstractClass.

+1

Penso che la sua domanda avesse un senso che chiedeva è possibile prendere in giro l'oggetto * equivalente * MyClass nella sua domanda –

+0

No, perché in quel caso la domanda corretta avrebbe dovuto essere: Posso usare Moq per prendere in giro qualsiasi classe concreta ? La risposta sarebbe stata semplicemente no. Per quanto ne sappia, il mago di Rhino può farlo anche se. –