2010-08-30 179 views
1

有必要检查执行的抽象“的MyMethod”虚拟方法“MyAbstractClass”:如何使用抽象方法测试抽象类中的方法?

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, 版本= 0.0.0.0,文化=中立,公钥=空”不具有 实现..

请指教,我怎么能得到什么问题呢?

非常感谢!

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

回答

1

请参阅this answer关于部分嘲讽,我想你将不得不提供一个具体的实现。

+1

在链接的答案中,我看到以下内容:部分模拟仅在需要测试功能时才有用抽象类的模拟实现抽象方法。这正是我所需要的。问题是:我不知道如何得到那个... – Budda 2010-08-31 13:44:40

1

我明白这不是对moq问题的回答,但无论如何。即使你有很多抽象属性,VS也可以非常容易地添加空的(实际上是抛出的)实现。所以,如果MyMethod不依赖于这些属性的设计,我会添加一个空的派生类并测试它。

+0

大概这是一个好主意。但对于这种情况下,如果类接口更改,我将需要更新'测试'类的接口,这并不是真正需要的...... – Budda 2010-08-31 13:52:29

2

您发布的代码运行正常(除了小错拼)。我根本无法让它失败,同样的错误。 Moq在运行时实现抽象属性并使其返回默认值(在这种情况下为0)。尝试更新版本的Moq。

我也会提醒不要将测试逻辑放入类中。如果TestPassed的唯一目的是用于测试,那么它绝对不属于此处。如果您发布实际代码,我们可以提供更多帮助。

+0

谢谢。 'TestPass'仅用于演示目的。 :) 你说得对,原来的例子工作正常...抱歉,我的错,我没有检查它(这是从我的例子简化)。现在我发现嘲笑'内部'成员会出现这个问题...将尝试解决这个问题。 再次感谢! – Budda 2010-08-31 13:51:43

+0

Moq使用Castle Dynamic Proxy在运行时创建模拟。如果您对内部成员有问题,那是因为动态代理无法创建这些内容。您可以将InternalsVisibleTo添加到包含SUT的程序集中,并在参数中指定Castle Dynamic Proxy以使其全部工作。 – 2010-08-31 14:15:45

+0

我试图用InternalsVisibleTo标记我的程序集,但它没有帮助。应该是?可能是id做了一个错误的方法(只针对一个项目...不针对每个项目的程序集)... – Budda 2010-09-02 23:40:52