C# Rhino模拟部分存根必须是公共方法吗?

C# Rhino模拟部分存根必须是公共方法吗?,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我已经使用Rhino mock编写了一些单元测试,我对测试结果感到满意,除了我不得不将底层web服务公开为公共虚拟服务(isUserInRoleWebService)这一事实,大概是因为这是我在部分模拟中的存根。 我通常使用反射来避免暴露私有方法,但这对模拟对象不起作用。 有人知道这件事吗?这一定是常见的情况 [SetUp] public void SetUp() { _mockRepository = new MockRepository(); _entitlementCach

我已经使用Rhino mock编写了一些单元测试,我对测试结果感到满意,除了我不得不将底层web服务公开为公共虚拟服务(isUserInRoleWebService)这一事实,大概是因为这是我在部分模拟中的存根。 我通常使用反射来避免暴露私有方法,但这对模拟对象不起作用。 有人知道这件事吗?这一定是常见的情况

[SetUp]
public void SetUp()
{
    _mockRepository = new MockRepository();
    _entitlementCache = _mockRepository.PartialMock<EntitlementCache>();
}

[Test]
// simple test to verify membership of a single role
public void Test_SingleRoleMember()
{
    (new ReflectedObject(_entitlementCache)).InvokeInstanceMethod(
                                                "setRoleHierachy", 
                                                new object[] { hierachy2Level }
                                             );

    using (_mockRepository.Record())
    {
        // I had to convert isUserInRoleWebService to public :-(
        _entitlementCache.Stub(x => x.isUserInRoleWebService("user", "Role 1"))
                         .Repeat
                         .Once()
                         .Return(true);
    }

    using (_mockRepository.Playback())
    {
        bool res = _entitlementCache.IsUserInRole("user", "Role 1");
        Assert.AreEqual(true, res, "user member of 'Role 1'");
    }
}

[TearDown]
public void TearDown()
{
    _mockRepository.ReplayAll();
    _mockRepository.VerifyAll();
}
[设置]
公共作废设置()
{
_mockRepository=新建mockRepository();
_AuthenticationCache=_mockRepository.PartialMock();
}
[测试]
//验证单个角色成员身份的简单测试
公共无效测试\u SingleRoleMember()
{
(新的ReflectedObject(_AuthenticationCache)).InvokeInstanceMethod(
“setRoleHierachy”,
新对象[]{hierachy2Level}
);
使用(_mockRepository.Record())
{
//我必须将iUserInRoleWebService转换为公共:-(
_authoritmentCache.Stub(x=>x.isUserInRoleWebService(“用户”、“角色1”))
.重复
.一次
.返回(真);
}
使用(_mockRepository.Playback())
{
bool res=_authoritmentcache.IsUserInRole(“用户”、“角色1”);
aresequal(true,res,“角色1”的用户成员);
}
}
[撕裂]
公共无效拆卸()
{
_mockRepository.ReplayAll();
_mockRepository.VerifyAll();
}

通常,我不会测试或模拟私有方法。在这种情况下,您最好将web服务本身作为缓存上的属性提供,然后模拟它。例如:

IWebService service = ...
service.Expect(s => s.IsUserInRoleWebService("user", "Role 1")).Return(true);

EntitlementCache cache = ...
cache.Service = service;

bool result = cache.IsUserInRole("user", "Role 1");
Assert.IsTrue(result, "user member of 'Role 1'");

您可以使用部分模拟来覆盖受保护的内部虚拟方法。请注意,您需要在测试的AssemblyInfo.cs项目中指定
[InternalsVisibleTo(“您的测试项目”)]

protectedinternal
(或者
protectedinternal
,如果您愿意)是
protected
internal
的结合。因此,
internal
+
[InternalsVisibleTo]
使方法对您的测试项目可见,并且
protected
允许Rhino覆盖
virtual
方法