2012-12-14 12 views
6

Uwaga, jestem trochę nowy w TDD, więc przyjmuję ogólne porady, a także konkretną odpowiedź.czy AutoMoqCustomization działa dla klas abstrakcyjnych?

Nie można tworzyć instancji klas ani interfejsów abstrakcyjnych. Oczywiście Moq może dać mi wyśmiewaną instancję ADataFeed w drugim teście. Dlaczego funkcja AutoMoqCustomization działa dla interfejsów IDataFeed, ale nie dla klas abstrakcyjnych ADataFeed, zamiast tego wywołuje wyjątek InvalidOperationException?

Po drugie, jakie byłoby podejście AutoFixture (lub ogólnie TDD) do kierowania projektem, który mógłby wymagać abstrakcyjnej klasy z konstruktorem wymagającym i gwarantującym pewne wartości, takie jak ciąg połączenia w tym przypadku?

[Theory, AutoMoqData] 
public void AllDataFeedsHaveAConectionString(
    IDataFeed sut) 
{ 
    var result = sut.GetConnectionString(); 
    Assert.Null(result); 
} 

[Fact] 
public void AllDataFeedsRequireAConnectionString() 
{ 
    var expected = Guid.NewGuid().ToString(); 
    var sut = new Mock<ADataFeed>(expected); 
    var result = sut.Object.GetConnectionString(); 
    Assert.Equal(expected, result); 
} 

[Theory, AutoMoqData] 
public void AllDataFeedsRequireAConnectionString2(
    [Frozen] string expected, 
    ADataFeed sut) 
{ 
    var result = sut.GetConnectionString(); 
    Assert.Equal(expected, result); 
} 
+4

'AutoMoqCustomization' może zapewnić abstrakcyjne klasy bazowe, a także interfejsy. Czy konstruktor 'ADataFeed' jest publiczny? Jeśli tak, uczyń go chronionym. Jest to błąd projektowy z publicznym konstruktorem w klasie abstrakcyjnej –

+0

BARDZO interesujący. Ok, moq obsługuje publiczny konstruktor w klasie abstrakcyjnej ... autofunkcja nie działa. Nie należy pracować z prywatnym konstruktorem i oba działają, gdy są chronione. Wezmę na słowo, że to błąd w projektowaniu ... kolejne pytanie na inny dzień. W międzyczasie będę używać chronionych. – cocogorilla

+0

FTR: http://msdn.microsoft.com/en-us/library/vstudio/ms229047(v=vs.100).aspx –

Odpowiedz

1

Klasy abstrakcyjne z konstruktorami muszą być oznaczone jako chronione. AutoFixture nie będzie programować na klasach abstrakcyjnych, gdy konstruktor jest oznaczony jako publiczny, ponieważ jest to błąd projektowy.

Powiązane problemy