2010-04-05 98 views
6

Moq允许开发人员嘲笑受保护的成员。我在Rhino.Mocks寻找相同的功能,但未能找到它。如何用Rhino.Mocks模拟受保护的虚拟成员?

这里是一个例子,从Moq Quick Start页面如何模拟受保护的方法。

// at the top of the test fixture 
using Moq.Protected() 

// in the test 
var mock = new Mock<CommandBase>(); 
mock.Protected() 
    .Setup<int>("Execute") 
    .Returns(5); 

// if you need argument matching, you MUST use ItExpr rather than It 
// planning on improving this for vNext 
mock.Protected() 
    .Setup<string>("Execute", 
     ItExpr.IsAny<string>()) 
    .Returns(true); 

让我知道,如果我追逐的东西,不退出。

+0

你可能想看看这个链接http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx – juharr 2011-03-04 20:11:47

+2

这不是一个真正合适的解决方案 - 不得不改变你的原始类,以在其他类m中内部公开方法你是否正在改变你的设计以迎合测试。难闻的气味对我来说。 – 2011-11-21 08:34:36

回答

4

我相信这个功能在Rhino Mocks中不存在。

你为什么试图嘲笑受保护的成员?为什么不把整个班级作为一个整体呢?或者,您可以创建测试类的子类并手动创建“模拟”受保护的方法。

+0

我目前正在继承SUT并模拟受保护的成员。我想知道是否有像Moq这样的东西能够让我从子类化中解脱出来。假设Rhino.Mocks没有这个功能,我会接受你的答案。 – Vadim 2010-04-08 01:33:56

+0

因为微软现在有这样的事情。 ... 保护内部虚拟OkResult好() { } – 2014-07-03 18:55:54

2

我们创建protected方法为internal,然后露出内部的单元测试项目和犀牛通过添加以下行到你的AssemblyInfo嘲笑:

[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")] 
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

作品一种享受我们

+0

keith,谢谢,但我正在寻找一些其他的解决方案,然后修改我的AssemblyInfo。 顺便说一句。大约5年前,我创建了一个为您生成InternalVisibleTo代码的实用程序。它可能会为你节省一些时间。你可以在这里找到它:http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ – Vadim 2012-09-18 12:20:47

+0

@Vadim很好谢谢你,我相信VS2012允许你模仿任何东西这个问题可能不适用于下一代单元测试! – keith 2012-09-19 03:07:25