2012-08-02 96 views
3
IEmployeeServiceProxy* empSvcMock = m_Mocks.InterfaceMock<IEmployeeServiceProxy>(); 
m_EmpSvcMock.reset(empSvcMock); // shared_ptr because my class Client ctor expects a shared_ptr<IEmployeeServiceProxy> 

Client client(m_EmpSvcMock); 

如何防止m_EmpSvcMock被HippoMock內部破壞?將模擬傳遞給shared_ptr時,兩者都會破壞模擬。HippoMocks堅持摧毀模擬

編輯 - 答:

m_Mocks.ExpectCallDestructor(m_EmpSvcMock.get()); 
m_EmpSvcMock.reset(); 

回答

2

在Git版本(從Assembla),你可以告訴它註冊一個被調用的析構函數。額外的好處是,它會警告你之後使用ZombieMockException調用它的函數,所以如果你確實在某個地方泄漏了一個指針並且它被使用了,你就會知道一個可讀的錯誤。

+0

所以當把模擬傳給shared_ptr時,我們應該簡單地註冊一個NOP析構函數?你能舉個例子嗎? – 2012-08-02 07:57:29

+0

+1這聽起來很有意思 – stijn 2012-08-02 07:59:19

+0

將它傳遞給共享指針時,您希望在測試結束時但在驗證模擬之前調用析構函數。所以,告訴模擬庫,你很好。這是它的單元測試http://www.assembla.com/code/hippomocks/git/nodes/master/HippoMocksTest/test_zombie.cpp,它明確地刪除它,但這相當於最後一個被破壞的共享指針。 – dascandy 2012-08-02 08:03:23

2

使用輔助這樣的,它與無操作刪除器創建一個shared_ptr:

template< class T > 
void NoDelete(T*) 
{ 
} 

template< class T > 
std::shared_ptr<T> make_shared_ref(T* t) 
{ 
    return std::shared_ptr<T>(t, NoDelete<T>); 
} 

    //usage 
m_EmpSvcMoc = make_shared_ref(empSvcMock); 
+0

是的,我知道這個'解決方案'(黑客),但我希望HippoMock的作者會評論隱含地管理嘲笑釋放的必要性。順便說一句,你的意思是m_EmpSvcMock = make_shared_ref(empSvcMock); – 2012-08-02 07:51:48

+0

謝謝,修正了使用 – stijn 2012-08-02 07:58:48