【问题标题】:does AutoMoqCustomization work for abstract classes?AutoMoqCustomization 是否适用于抽象类?
【发布时间】:2012-12-02 21:15:31
【问题描述】:

请注意,我对 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);
}

【问题讨论】:

  • AutoMoqCustomization 可以提供抽象基类和接口。 ADataFeed 的构造函数是公开的吗?如果是这样,请使其受到保护。这是抽象类上的公共构造函数的设计错误
  • 非常有趣。好的,起订量处理抽象类上的公共构造函数...... autofixture 没有。两者都不能与私有构造函数一起工作,并且在受保护时都可以工作。我会相信你的话,这是一个设计错误......另一天的另一个问题。在此期间,我将使用 protected。
  • 这解决了您的问题吗?
  • 重要的是你得到了你的问题的答案 :) 关于问题的第二部分,请不要创建抽象类,一切都会简单得多:) "Favor object组合优于类继承。”

标签: interface moq abstract xunit.net autofixture


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2011-01-16
    • 2017-06-20
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多