如何用抽象方法测试抽象类中的方法?
有必要检查抽象“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' 没有 实施..
请指教,我怎样才能解决问题?
多谢!
PS 实际上,我可以继承 MyAbstractClass 并提供“StatusCode”属性的实现,但我有一堆属性要实现......
It is necessary to check implementation of 'MyMethod' virtual method in the abstract '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;}
}
I've tried to do the following:
[TestMethod()]
{
Mock<MyAbstractClass> mockClass = new Mock<MyAbstractClass>();
mockClass.Object.MyMethod();
Assert.IsTrue(mockClass.Object.TestPassed);
}
on attempt to execute 'MyMethod' the following error is generated:
Method 'set_StatusCode' in type
'MyAbstractClass`2Proxy0434d60c0f4542fb9b4667ead4ca3a18'
from assembly 'DynamicProxyGenAssembly2,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an
implementation..
Please advise, how could I get the problem resolved?
Thanks a lot!
P.S. Actually, I could inherit from MyAbstractClass and provide implementation for 'StatusCode' property, but I have a bunch of properties to be implemented...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您发布的代码运行良好(除了轻微的拼写错误)。我根本无法让它因同样的错误而失败。 Moq 在运行时实现抽象属性并使其返回默认值(在本例中为 0)。尝试更新版本的 Moq。
我还警告不要将测试逻辑放入类中。如果
TestPassed
的唯一目的是用于测试,那么它绝对不属于那里。如果您发布真实的代码,我们可以提供更多帮助。The code that you posted runs fine (except for minor misspellings). I simply could not get it to fail with the same error. Moq implements the abstract property at runtime and makes it return the default value(0 in this case). Try a more recent version of Moq.
I would also caution against putting test logic into the class. If the only purpose of
TestPassed
is for testing than it definitely doesn't belong there. We could help a great deal more if you post real code.请参阅这个答案关于部分模拟,我想你会必须提供具体的实施方案。
See this answer about partial mocking and I think you'll have to provide a concrete implementation.
我知道这不是您最小起订量问题的答案,但无论如何。即使您有很多抽象属性,VS 也可以非常轻松地添加空(实际上是抛出)实现。因此,如果
MyMethod
在设计上不依赖于这些属性,我将添加一个空的派生类并对其进行测试。I understand that it's not an answer to your moq question, but anyway. Even if you have a lot of abstract properties, VS makes it extremely easy to add empty (actually, throwing) implementations. So, if
MyMethod
does not depend on these properties by design, I'd add an empty derived class and test it.