2012-12-14 11 views
6

请注意,我对TDD有点新鲜,所以我会接受一般性建议以及具体的答案。是否对抽象类使用AutoMoqCustomization工作?

抽象类和接口都不能被实例化。显然Moq可以在第二次测试中给我一个ADataFeed的实例。为什么AutoMoqCustomization适用于接口IDataFeed但不适用于抽象类ADataFeed,而不是引发InvalidOperationException?其次,什么是AutoFixture方法(或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的构造函数是公共的吗?如果是这样,请保护它。这是一个抽象类 –

+0

上的公共构造函数的设计错误非常有趣。好吧,moq处理抽象类的公共构造函数... autofixture不会。既不能使用私有构造函数,也不能在受保护时使用。我会尽力告诉你这是一个设计错误......另一个问题是另一个问题。在此期间,我将使用保护。 – cocogorilla

+0

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

回答

1

带构造函数的抽象类必须标记为protected。当构造函数标记为public时,AutoFixture不会针对抽象类进行编程,因为这是设计错误。