Obecnie nie udaje mi się kpić z interfejsu, który zwraca wartość unique_ptr. Na przykład, biorąc pod uwagęHippoMocks - kpiąc z funkcji zwracającej 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>());
}
to zawiedzie skompilować ponieważ realizacja Return
sprawia kopię unique_ptr
Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
i oczekiwanie próbuje zwrócić 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;
}
mam wypróbowany Do
, zgodnie z sugestią for a similar problem with returned references.
Próbowałem również napisać własny ValueWrapper<T>
, który generuje unique_ptr, ale gdzieś wartość jest zawsze kopiowana. W tej chwili zabrakło mi pomysłów.
Wygląda na to, że HippoMocks nie jest jeszcze gotowy na typy ruchu typu C++ 11. Może mógłbyś napisać specjalizację dla 'ReturnValueWrapper>' która nie * nie * kopiuje wewnętrznie? –
Czy wypróbowałeś późniejsze wersje hippomocks, które mają wersję C++ 0x? –
@Arne Miałem mniej więcej próbowałem czegoś takiego. Najwyraźniej zrobiłem coś złego na początku. Po kolejnym przejściu znalazłem rozwiązanie, które działało. Dodam go do [repozytorium github] (https://github.com/dascandy/hippomocks) później. – Thomas