Существует тест класса, который в настоящее время принимает unique_ptr<Interface>&&
в своем конструкторе, чтобы выразить, что он хочет взять одно владение реализацией интерфейса. Проблемы возникают, когда вы хотите протестировать этот класс, используя издеваемое Interface
: mocking framework (HippoMocks) дает мне только Interface*
, которого я не имею, поэтому не могу удалить.Единичное тестирование, mocking и unique_ptr
У меня была та же проблема, прежде чем при тестировании классов с const shared_ptr<Interface>&
в качестве аргументов, но фиксировано что не Заказное не-оп Deleter:
template< class T >
void NoDelete(T*)
{
}
//create a shared_ptr without effective deleter
template< class T >
std::shared_ptr<T> mock_shared(T* t)
{
return std::shared_ptr<T>(t, NoDelete<T>);
}
Interface* iface = mocks.GetMeAMock<Interface>();
DoStuffWithSharedPtrOfInterface(mock_shared<Interface>(iface));
Аналогичное исправление unique_ptr реально не работает вне потому что deleter является аргументом шаблона:
template< class T >
struct NoDelete
{
void operator()(T*)
{
}
};
//oops this is totally useless since std::unique_ptr< T, NoDelete<T> >
//is not quite the same type as std::unique_ptr<T>
template< class T >
std::unique_ptr< T, NoDelete<T> > mock_unique(T* t)
{
return std::unique_ptr< T, NoDelete<T> >(t, NoDelete<T>());
}
Есть ли обходной путь для этого? Или я не должен использовать unique_ptr здесь, в первую очередь?
обновление Я дал это; должен работать, но sizeof (ptr) теперь 8, трудно сказать, какое влияние это имеет.
//use CustomUniquePtr::type instead of uniqe_ptr
template< class T >
struct CustomUniquePtr
{
typedef typename std::unique_ptr< T, void (*) (T*) > type;
}
//use everywhere
template< class T >
CustomUniquePtr<T>::type make_unique(T* p)
{
return CustomUniquePtr<T>::type(p, Delete<T>);
}
//use when mocking, doe not delete p!
template< class T >
CustomUniquePtr<T>::type mock_unique(T* p)
{
return CustomUniquePtr<T>::type(p, NoDelete<T>);
}
«Чтобы выразить, что он хочет получить единоличное владение реализацией интерфейса». Для выражения этого выражения требуется значение 'unique_ptr', а не' && '. –
«насмешливый фреймворк дает мне только интерфейс *, который у меня нет, поэтому его нельзя удалить». Можете ли вы не изменить насмешливую структуру, чтобы позволить вам это? Если ваш интерфейс требует владения, то ваша издевательская структура должна * проверить * право собственности. В противном случае вы его не тестируете. –
@NicolBolas хорошая точка о стоимости, я оставлю это, так как это бесполезно для вопроса; указатели, возвращаемые насмешливыми фреймами, не указывают на что-либо, размещенное с использованием стандартного new/malloc/whatever, оно просто возится с vtable, так что это не то, что может принадлежать – stijn