2010-09-14 84 views
0

我已经阅读了很多关于嘲笑的知识,特别是使用Rhino Mocks,并且了解到Rhino Mocks只能模拟具体类中的虚拟或虚拟方法的接口方法。我已经读过,其原因是因为Rhino mock无法拦截非虚拟方法,这是我卡住的地方。截取方法是什么意思?截取方法实际上如何在嘲笑方面发挥作用(特别是犀牛嘲讽)什么是嘲笑方法拦截?

回答

1

基本上这个想法是它创建了一个覆盖任何虚拟或接口方法并将“模拟”代码插入它们的“幕后”类。如果您有(根据您的评论的问题)

高度简化的例子/概述

public EmailHelper 
{ 
    public virtual int SendEmail(MailMessage message) 
    { 
     var server = ConnectToServer(); 
     int statusCode = server.SubmitEmail(message); 
     return statusCode;  
    } 
} 

,然后在测试(我忘了犀牛的这个语法,但是这是非常接近)

var mock = Mocks.CreateMockFor<EmailHelper>(); 
Expect.Call(mock.SendEmail).Return(5); 

在幕后它将使用反射来加载SomeClass对象,搜索它的接口实现和虚拟方法以及gen中心提供全方位的一类像

public MockEmailHelper 
{ 
    public override int SendEmail(MailMessage message) 
    { 
     return 5; 
    } 
} 

所以你可以看到,当你调用SendEmail的模拟版本,它不会连接到服务器等,它只会做你告诉它,这样你就可以测试你的代码这取决于“电子邮件模块”而不实际发送电子邮件。

+0

所以嘲讽框架实际上调用了你的方法的实现。它是否真的执行它们?例如,如果我嘲笑电子邮件方法,它会发送电子邮件吗? – Xaisoft 2010-09-14 16:58:51

+0

不,这就是整个问题......所以你不依赖于外部系统。我将增加更多的帮助澄清,坚持.... – 2010-09-14 17:07:26

+0

好的谢谢,我会等待你的澄清。 – Xaisoft 2010-09-14 17:13:30