【问题标题】:How to test a method in an abstract class with abstract methods?如何使用抽象方法测试抽象类中的方法?
【发布时间】:2010-08-30 22:31:17
【问题描述】:

需要检查抽象“MyAbstractClass”中“MyMethod”虚方法的实现:

public abstract MyAbstractClass
{
    public void MyMethod()
    {
        Testpassed = true;
    }

    public abstract int StatusCode{get;internal set;} // **EDIT**: internal setter was added

    public bool TestPassed{get;private set;}
}

我已尝试执行以下操作:

[TestMethod()]
{
    Mock<MyAbstractClass> mockClass = new Mock<MyAbstractClass>();
    mockClass.Object.MyMethod();
    Assert.IsTrue(mockClass.Object.TestPassed);
}

在尝试执行“MyMethod”时会生成以下错误:

类型中的方法“set_StatusCode” 'MyAbstractClass`2Proxy0434d60c0f4542fb9b4667ead4ca3a18' 从程序集'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 没有 实施..

请指教,我该如何解决这个问题?

非常感谢!

附:实际上,我可以从 MyAbstractClass 继承并提供 'StatusCode' 属性的实现,但我有一堆属性要实现...

【问题讨论】:

    标签: .net moq abstract-class


    【解决方案1】:

    您发布的代码运行良好(除了轻微的拼写错误)。我根本无法让它因同样的错误而失败。 Moq 在运行时实现抽象属性并使其返回默认值(在本例中为 0)。尝试更新版本的起订量。

    我还告诫不要将测试逻辑放入课程中。如果TestPassed 的唯一目的是测试,那么它绝对不属于那里。如果您发布真实代码,我们可以提供更多帮助。

    【讨论】:

    • 谢谢。 'TestPass' 仅用于演示目的。 :) 你说得对,原始示例运行良好......对不起我的错,我没有检查它(它是从我的示例中简化的)。现在我看到模拟“内部”成员出现了问题......将尝试解决这个问题。再次感谢!
    • Moq 使用 Castle Dynamic Proxy 在运行时创建模拟。如果您遇到内部成员问题,那是因为动态代理无法创建这些成员。您可以将 InternalsVisibleTo 添加到包含 SUT 的程序集中,并在参数中指定 Castle Dynamic Proxy 以使其全部工作。
    • 我尝试用 InternalsVisibleTo 标记我的程序集,但没有帮助。应该是?可能 id 这样做是错误的方式(仅适用于一个项目......而不是装配中的每个项目)......
    • 异常应该相当明确地说明什么不能用于什么。您需要将 InternalsVisibleTo 添加到包含内部成员的程序集中,并在参数中指定 Castle Dynamic Proxy。它必须是完整的程序集名称,带有公钥令牌和版本。
    【解决方案2】:

    请参阅this answer 了解部分模拟,我认为您必须提供具体的实现。

    【讨论】:

    • 在链接的答案中,我看到以下内容:部分模拟仅在您想使用抽象方法的模拟实现来测试抽象类的功能时才有用。这正是我所需要的。问题是:我不知道如何获得...
    【解决方案3】:

    我知道这不是您的起订量问题的答案,但无论如何。即使您有很多抽象属性,VS 也可以非常轻松地添加空(实际上是抛出)实现。所以,如果MyMethod 不依赖这些属性,我会添加一个空的派生类并对其进行测试。

    【讨论】:

    • 这可能是个好主意。但是对于这种情况,如果更改类接口,我将需要更新“测试”类的接口,这并不是真正需要的......
    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多