2012-12-14 2 views
6

TDD에는 다소 익숙합니다. 따라서 특정 답변뿐만 아니라 일반적인 조언도 취할 것입니다.추상 클래스의 AutoMoqCustomization이 작동합니까?

추상 클래스 나 인터페이스를 인스턴스화 할 수 없습니다. 분명히 Moq는 두 번째 테스트에서 ADataFeed의 조롱 된 인스턴스를 제공 할 수 있습니다. 왜 AutoMoqCustomization은 IDataFeed 인터페이스에서 작동하지만 추상 클래스 ADataFeed에서는 작동하지 않고 InvalidOperationException을 던집니까?

2 차적으로, 자동 고정 접근법 (또는 일반적으로 TDD)은 생성자를 사용하여 추상 클래스를 호출하여 특정 값 (예 : 연결 문자열)을 필요로하고 보증하도록 설계하는 것일 수 있습니까?

[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'은 추상 기본 클래스와 인터페이스를 제공 할 수 있습니다. 'ADataFeed'의 생성자가 public입니까? 그렇다면 보호하십시오. 그것은 추상적 인 클래스 public constructor에 대한 설계 에러입니다. –

+0

VERY 흥미 롭습니다. 좋아, moq 추상 클래스에 public 생성자를 처리 ... autofixture하지 않습니다. 개인 생성자와 함께 작업하지 않으며 둘 다 보호 될 때 작동합니다. 나는 그것이 틀린 날이라는 또 다른 질문이다. 잠시 동안 나는 보호를 사용합니다. – cocogorilla

+0

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

답변

1

추상 생성자가있는 클래스는 protected로 표시되어야합니다. AutoFixture는 생성자가 public으로 표시된 경우 추상 클래스에 대해 프로그램하지 않습니다. 이는 설계 오류이기 때문입니다.