2013-03-01 47 views
6

我目前沒有成功模擬一個返回unique_ptr的接口。例如,給定HippoMocks - 模擬一個函數,返回一個unique_ptr

struct IFoo {  
    virtual std::unique_ptr<IFoo> foo = 0; 
}; 


int main() 
{ 
    MockRepository mocks; 
    auto foo = mocks.Mock<IFoo>(); 
    mocks.OnCall(foo, IFoo::foo) 
     .Return(std::unique_ptr<IFoo>()); 
} 

這不能編譯,因爲Return實施使的unique_ptr

Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; } 

的副本,並期望試圖返回的unique_ptr

template <typename Z> 
Z MockRepository::DoExpectation(base_mock *mock, std::pair<int, int> funcno, const base_tuple &tuple) 
{ 
    ... 
    return ((ReturnValueWrapper<Z> *)call->retVal)->rv; 
} 

我已經嘗試Do,建議for a similar problem with returned references

我也試過編寫我自己的ValueWrapper<T>,它生成一個unique_ptr,但在某處值總是被複制。現在我已經沒有想法了。

+1

看來HippoMocks還沒有準備好用於C++ 11的移動類型。也許你可以爲'ReturnValueWrapper >'編寫一個專門化程序,它不會*在內部複製? – 2013-03-01 14:58:20

+0

你有沒有試過hippomocks以後的版本,有一個C++ 0x版本? – 2013-03-01 16:00:43

+0

@Arne我或多或少地嘗試過這樣的事情。顯然我最初做錯了什麼。在另一個去之後,我發現了一個可行的解決方案。稍後我會將它添加到[github存儲庫](https://github.com/dascandy/hippomocks)。 – Thomas 2013-03-01 17:15:26

回答

2

一種解決問題的辦法是創建具有一個返回的返回值作爲臨時

template <class T> 
class TypedReturnValueHolder : public ReturnValueHolder { 
public: 
    virtual T rv() = 0; 
}; 

的附加方法的派生的接口和它們修改原始ReturnValueHolder

template <class T> 
class ReturnValueWrapper : public ReturnValueHolder { 
public: 
typename no_cref<T>::type rv; 
ReturnValueWrapper(T rv) : rv(rv) {} 
}; 

從繼承並實現派生接口。

template <class T> 
class ReturnValueWrapper : public TypedReturnValueHolder<T> { 
    typename no_cref<T>::type prv; 
public: 
    ReturnValueWrapper(T rv) : prv(rv) {} 
    virtual T rv() { return prv; }; 
}; 

一旦已經完成,從DoExpectation回報可以從問題重寫時使用Do

mocks.OnCall(foo, IFoo::foo) 
    .Do([](){ return std::unique_ptr<IFoo>(); }); 

然後編譯和運行的寫作

 if (call->retVal) 
      return ((TypedReturnValueHolder<Z> *)call->retVal)->rv(); 

的例子預期。

相關問題