AutoMoqCustomization是否适用于抽象类?

coc*_*lla 6 interface moq xunit.net abstract autofixture

请注意,我对TDD有些新意,所以我会提出一般性的建议以及具体的答案.

抽象类和接口都不能实例化.显然,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);
}
Run Code Online (Sandbox Code Playgroud)

coc*_*lla 1

具有构造函数的抽象类必须标记为受保护的。当构造函数标记为公共时,AutoFixture 不会针对抽象类进行编程,因为这是一个设计错误。