2011-02-20 8 views
5

:tarihinde Mock - kullanarak :: testi :: Bir() Aşağıdaki <a href="http://code.google.com/p/googlemock/" rel="nofollow">Google Mock</a> beyanı kullanırken bir derleme hatası alırsınız

EXPECT_CALL(some_object, someFunction(1,An<AStructIDefined>())) 
    .Times(2); 

hatadır:

1>ClCompile: 
1> TestMyClass.cpp 
1>TestMyClass.cpp(189): error C2664: 'mynamespace::MockMyClassClient::gmock_someFunction' : cannot convert parameter 2 from 'testing::Matcher<T>' to 'const testing::Matcher<T> &' 
1>   with 
1>   [ 
1>    T=mynamespace::AStructIDefined 
1>   ] 
1>   and 
1>   [ 
1>    T=const mynamespace::AStructIDefined & 
1>   ] 
1>   Reason: cannot convert from 'testing::Matcher<T>' to 'const testing::Matcher<T>' 
1>   with 
1>   [ 
1>    T=mynamespace::AStructIDefined 
1>   ] 
1>   and 
1>   [ 
1>    T=const mynamespace::AStructIDefined & 
1>   ] 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

yanlış yapıyorum ?


GÜNCELLEME: VS2010 kullanıyorum

.

bir_işlev beyanı geçerli:

virtual void someFunction(long long ll, const AStructIDefined& a_struct); 

An() aşağıdaki tanımıyla bir Google Mock wildcard matcher geçerli:

// Creates a matcher that matches any value of the given type T. 
template <typename T> 
inline Matcher<T> An() { return A<T>(); } 

yapının bir basitleştirilmiş henüz temsili versiyonu:

namespace mynamespace { 

class ABaseCLass 
{ 
public: 
    virtual ~ABaseCLass(){}; 
    virtual bool isValid() const = 0; 
}; 

struct AStructIDefined : public ABaseCLass 
{ 
public: 
    OrderStatusReport(SomeEnum1 e_, int i_, double d_); 

    SomeEnum1 e; 
    int i; 
    double d; 

    const std::string toString() const; 
    bool isSane() const; 
    bool operator== (const SomeEnum1& ref_) const; 
    double getD() const; 
    int getI() const; 
    bool isCondition() const; 
}; 

} // namespace mynamespace 
+0

AStructIDefined ve An? Tanımlarını verebilir misiniz? –

+0

Hangi derleyiciyi kullanıyorsunuz? –

cevap

4

Çözüm, bildirimi değiştirmek için:

EXPECT_CALL(some_object, someFunction(1,An<AStructIDefined>())) 
    .Times(2); 

C örtülü const ve fonksiyon parametreleri üzerine referansı &, atmalarını ++ ama google sahte beyanı parametre olarak gönderilen işlevin imzası görünen türü değil türü gerektiren görünüyor

EXPECT_CALL(some_object, someFunction(1,An<const AStructIDefined &>())) 
    .Times(2); 

için işlevi.