6

私は現在、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提案されているように、私は試しました。

また、unique_ptrを生成する独自の記述を試みましValueWrapper<T>たが、どこかで値が常にコピーされます。今、私はアイデアを使い果たしました。

4

1 に答える 1

2

この問題の解決策の1つは、戻り値を一時的なものとして返す追加のメソッドを使用して派生インターフェイスを作成することです。

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ように書くことができます

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

使用するように書き直したときの質問の例Do

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

次に、期待どおりにコンパイルして実行します。

于 2013-03-01T17:12:29.500 に答える