如何使用Rhino.Mocks模拟受保护的虚拟成员?

6

Moq 允许开发人员模拟受保护的成员。我在Rhino.Mocks中寻找相同的功能,但未能找到。

以下是Moq快速入门页面中一个示例,说明如何模拟受保护的方法。

// 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);

如果我在追寻不存在的东西,请告诉我。


你可能想查看这个链接:http://geekswithblogs.net/MattRobertsBlog/archive/2008/12/16/how-to-make-a-quotprotectedquot-method-available-for-quotpartialquot-mocking-and-again.aspx - juharr
2
这并不是一个合适的解决方案 - 必须更改您的原始类以在其他类内部公开方法意味着您正在修改设计以适应测试。对我来说是一种不好的味道。 - Stephen Drew
2个回答

4

我认为Rhino Mocks中不存在这种功能。

你为什么要尝试模拟受保护的成员?为什么不直接测试整个类呢?或者,您可以创建测试类的子类并手动创建“模拟”的受保护方法。


我目前正在子类化SUT并模拟受保护的成员。我想知道是否有像Moq这样的东西可以让我免于子类化。如果Rhino.Mocks没有这个功能,我会接受你的答案。 - Vadim
1
因为微软现在有这样的东西。 protected internal virtual OkResult Ok() { } - Alex Nolasco

2
我们将protected方法创建为internal,然后通过在AssemblyInfo中添加以下行来将内部公开给单元测试项目和rhino mocks:
[assembly: InternalsVisibleTo("YourNamespace.TestProjectName")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

对我们来说非常有效


Keith,谢谢你,但我在寻找修改我的AssemblyInfo之外的其他解决方案。 顺便说一下,大约5年前,我创建了一个实用程序,可以为您生成InternalVisibleTo代码。它可能会为您节省一些时间。您可以在这里找到它:http://vkreynin.wordpress.com/2007/12/09/testing-internals-members-with-internalsvisibleto-attribute/ - Vadim
@Vadim,非常感谢,我相信VS2012可以模拟任何东西,因此这个问题在下一代单元测试中可能不存在! - keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接