2012-09-16 12 views
5

Il mio problema è che voglio eseguire il stub di una proprietà nella mia classe astratta, perché la mia classe in test usa quella proprietà. Attualmente sto usando l'ultima versione di Moq.Unità che verifica una classe che eredita da una classe astratta

mia classe astratta si presenta così:

public abstract class BaseService 
{ 
    protected IDrawingSystemUow Uow { get; set; } 
} 

E la mia classe in prova si presenta così:

public class UserService : BaseService, IUserService 
{ 
    public bool UserExists(Model model) 
    { 
     var user = this.Uow.Users.Find(model.Id); 
     if(user == null) { return false; } 

     reurn true; 
    } 
} 

io non riesco a capire come posso stub la proprietà Uow. Qualcuno ha qualche idea? Oppure il mio design è così brutto da dover passare alla proprietà Uow nella mia classe?

risposta

9

La configurazione corrente non funzionerà per un semplice motivo - la proprietà Uow non è sostituibile e il lavoro di Moq viene eseguito a questo punto. Cannot override, cannot mock.

La soluzione più semplice è semplicemente rendere la proprietà superabile. Cambiare la definizione della classe base per:

public abstract class BaseService 
{ 
    protected virtual IDrawingSystemUow Uow { get; set; } 
} 

Ora è possibile utilizzare protetto funzione di Moq (questo richiede di includere using Moq.Protected namespace nella classe di test):

// at the top of the file 
using Moq.Protected; 

// ... 

var drawingSystemStub = new Mock<IDrawingSystemUow>(); 
var testedClass = new Mock<UserService>(); 
testedClass 
    .Protected() 
    .Setup<IDrawingSystemUow>("Uow") 
    .Returns(drawingSystemStub.Object); 

// setup drawingSystemStub as any other stub 

// exercise test 
var result = testedClass.Object.UserExists(...); 
+0

Grazie mille mi ha davvero aiutato! Si è trattato di un bug secondario nel tuo frammento di codice. Restituisce (drawingSystemStub) deve essere sostituito con Returns (drawingSystemStub.Object). =) – Rikard

+0

@Rikard: grazie, corretto. –

+0

FYI @jimmy_keen - Link per "Can not override, can not befè" rotto – lukejkw

0

Credo che nel tuo caso è abbastanza diretto. Non si prende in giro la proprietà Uow ma il servizio IDrawingSystemUow. Pertanto, è possibile creare una simulazione di IDrawingSystemUow, assegnarla all'istanza di UserService tramite la proprietà Uow e quindi eseguire i test (ad esempio del metodo UserExists).

Problemi correlati