2012-10-06 9 views
6

Ho una classe astratta il cui costruttore ha bisogno di un argomento di raccolta. Come posso prendere in giro la mia classe per testarlo?Mocking di classe astratta con dipendenze del costruttore (con Moq)

public abstract class QuoteCollection<T> : IEnumerable<T> 
     where T : IDate 
    { 
     public QuoteCollection(IEnumerable<T> quotes) 
     { 
      //... 
     } 

     public DateTime From { get { ... } } 

     public DateTime To { get { ... } } 
    } 

Ogni elemento della collezione passato al costruttore deve implementare:

public interface IDate 
{ 
    DateTime Date { get; } 
} 

Se avrei scritto mia abitudine deridere sarebbe simile a questa:

public class QuoteCollectionMock : QuoteCollection<SomeIDateType> 
{ 
    public QuoteCollectionMock(IEnumerable<SomeIDateType> quotes) : base(quotes) { } 
} 

posso raggiungere questo obiettivo con Moq ?

risposta

11

Si può fare qualcosa sulla falsariga di:

var myQuotes = GetYourQuotesIEnumerableFromSomewhere(); 
// the mock constructor gets the arguments for your classes' ctor 
var quoteCollectionMock = new Mock<QuoteCollection<YourIDate>>(MockBehavior.Loose, myQuotes); 

// .. setup quoteCollectionMock and assert as you please .. 

Ecco un esempio molto semplice:

public abstract class AbstractClass 
{ 
    protected AbstractClass(int i) 
    { 
     this.Prop = i; 
    } 
    public int Prop { get; set; } 
} 
// ... 
    [Fact] 
    public void Test() 
    { 
     var ac = new Mock<AbstractClass>(MockBehavior.Loose, 10); 
     Assert.Equal(ac.Object.Prop, 10); 
    } 
+0

funziona come un fascino :) – Kuba

+0

contento di aver potuto aiutare :) –