如何使用抽象方法在抽象类中测试方法?

时间:2010-08-30 22:31:17

标签: .net moq abstract-class

有必要在抽象的'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'没有   实施..

请告知,我怎样才能解决问题?

非常感谢!

P.S。实际上,我可以从MyAbstractClass继承并为'StatusCode'属性提供实现,但是我有一堆要实现的属性......

3 个答案:

答案 0 :(得分:2)

您发布的代码运行正常(小错误拼写除外)。我只是无法让它失败并出现同样的错误。 Moq在运行时实现abstract属性并使其返回默认值(在本例中为0)。尝试更新版本的Moq。

我还要提醒不要将测试逻辑放入课堂。如果TestPassed的唯一目的是用于测试,那么肯定不属于那里。如果您发布实际代码,我们可以提供更多帮助。

答案 1 :(得分:1)

我知道这不是你的moq问题的答案,但无论如何。即使你有很多抽象属性,VS也很容易添加空(实际上,抛出)实现。因此,如果MyMethod在设计上不依赖于这些属性,我会添加一个空的派生类并对其进行测试。

答案 2 :(得分:1)

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