J'ai une configuration d'objet fictif qui ressemble à ceci:
MyObject obj;
EXPECT_CALL(obj, myFunction(_))
.WillOnce(Return(1))
.WillOnce(Return(1))
.WillOnce(Return(1))
.WillRepeatedly(Return(-1));
Y at-il un moyen de ne pas avoir à répéter .WillOnce(Return(1))
trois fois?
using testing::InSequence;
MyObject obj;
{
InSequence s;
EXPECT_CALL(obj, myFunction(_))
.Times(3)
.WillRepeatedly(Return(1));
EXPECT_CALL(obj, myFunction(_))
.WillRepeatedly(Return(-1));
}
Par souci d'exhaustivité, il existe une autre option standard/simple, bien que la réponse acceptée semble plus claire dans ce cas.
EXPECT_CALL(obj, myFunction(_)).WillRepeatedly(Return(-1));
EXPECT_CALL(obj, myFunction(_)).Times(3).WillRepeatedly(Return(1)).RetiresOnSaturation();
Cela peut être utile si vous savez ce que vous voulez que votre dernière réponse/valeur par défaut soit (-1
), mais que vous vouliez perdre le nombre de fois où il a été appelé auparavant.
Je crains qu'il n'y ait pas d'autre moyen de configurer ce comportement. Impossible de trouver un moyen évident dans la documentation au moins.
Vous pourrez peut-être résoudre ce problème en introduisant un contrôleur défini par l'utilisateur bien que, qui garde la trace du nombre d'appels et du seuil que vous pouvez fournir à partir de vos cas de test via des paramètres de modèle (vous ne savez pas réellement comment induire la ResultType
automatiquement :-():
using ::testing::MakeMatcher;
using ::testing::Matcher;
using ::testing::MatcherInterface;
using ::testing::MatchResultListener;
template
< unsigned int CallThreshold
, typename ResultType
, ResultType LowerRetValue
, ResultType HigherRetValue
>
class MyCountingReturnMatcher
: public MatcherInterface<ResultType>
{
public:
MyCountingReturnMatcher()
: callCount(0)
{
}
virtual bool MatchAndExplain
( ResultType n
, MatchResultListener* listener
) const
{
++callCount;
if(callCount <= CallThreshold)
{
return n == LowerRetValue;
}
return n == HigherRetValue;
}
virtual void DescribeTo(::std::ostream* os) const
{
if(callCount <= CallThreshold)
{
*os << "returned " << LowerRetValue;
}
else
{
*os << "returned " << HigherRetValue;
}
}
virtual void DescribeNegationTo(::std::ostream* os) const
{
*os << " didn't return expected value ";
if(callCount <= CallThreshold)
{
*os << "didn't return expected " << LowerRetValue
<< " at call #" << callCount;
}
else
{
*os << "didn't return expected " << HigherRetValue
<< " at call #" << callCount;
}
}
private:
unsigned int callCount;
};
template
< unsigned int CallThreshold
, typename ResultType
, ResultType LowerRetValue
, ResultType HigherRetValue
>
inline Matcher<ResultType> MyCountingReturnMatcher()
{
return MakeMatcher
( new MyCountingReturnMatcher
< ResultType
, CallThreshold
, ResultType
, LowerRetValue
, HigherRetValue
>()
);
}
Utilisez ensuite pour vous attendre à un résultat d'appel certainement compté:
EXPECT_CALL(blah,method)
.WillRepeatedly(MyCountingReturnMatcher<1000,int,1,-1>()) // Checks that method
// returns 1000 times 1
// but -1 on subsequent
// calls.
NOTE
Je n'ai pas vérifié si ce code fonctionnait comme prévu, mais il devrait vous guider dans la bonne direction.