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);
}
'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 –
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
FTR: http://msdn.microsoft.com/en-us/library/vstudio/ms229047(v=vs.100).aspx –