我已经使用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();
}
答案 0 :(得分:3)
您可以使用部分模拟来覆盖protected internal virtual
方法。请注意,您需要在测试项目的AssemblyInfo.cs中指定[InternalsVisibleTo("YourTestProject")]
。
protected internal
(或protected internal
,如果您愿意)是protected
和internal
的联盟。因此,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'");