Rhino Mock Partial Stub必须是公共方法吗?

时间:2010-12-23 13:42:05

标签: c# unit-testing rhino-mocks

我已经使用Rhino Mocks编写了一些单元测试,我对结果感到满意,除了我必须将底层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();
}

2 个答案:

答案 0 :(得分:3)

您可以使用部分模拟来覆盖protected internal virtual方法。请注意,您需要在测试项目的AssemblyInfo.cs中指定[InternalsVisibleTo("YourTestProject")]

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

答案 1 :(得分:1)

通常,我不测试或模拟私有方法。在这种情况下,似乎您可以更好地使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'");