2010-12-23 90 views
2

我已經使用Rhino Mocks編寫了一些單元測試,除了事實上我不得不將底層Web服務公開爲虛擬(isUserInRoleWebService)這一事實,因爲這是我在部分模擬中的存根(stub) 。 我通常使用反射來避免暴露私有方法,但這不適用於模擬對象。 有沒有人知道這個?必須是常見的情況。犀牛模擬部分存根必須是公共方法?

[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(); 
} 

回答

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'"); 
3

您可以使用部分模擬考試覆蓋protected internal virtual方法。請注意,您需要在被測項目的AssemblyInfo.cs中指定[InternalsVisibleTo("YourTestProject")]

protected internal(或protected internal,如果您願意的話)是protectedinternal的聯合。因此,internal + [InternalsVisibleTo]使該方法對您的測試項目可見,並且protected允許Rhino覆蓋virtual方法。