2013-06-21 27 views
7

Ben bir referans parametresi olarak bir boolean alır ve bir tamsayı döndüren bir sınıfı:hakkında sahte ByRef yöntem

class Foo 
{ 
    public: 
    Bar my_bar; 
    virtual int myMethod(bool &my_boolean) = 0; 
} 

/*...*/ 

int Foo::myMethod(bool &my_boolean){ 
    if (my_bar == NULL){ 
    my_boolean = false; 
    return -1; 
    } 
    else{ 
    my_boolean = true; 
    return 0; 
    } 

} 

Ve bu sınıf için bir taklidini oluşturdu: Ben

class MockFoo : public Foo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
} 

Bu tür bir fonksiyon için beklentileri nasıl ayarlayacağımıza dair problemlerim var, çünkü ve dönüş değerlerini referans parametrelerimi doğru bir şekilde oluşturmak için belirli değerlere ayarlamam gerekir. Bu tür bir işlevle gmock ile nasıl başa çıkabilirim? Ne düşündüğümü takip ettim. belgeler üzerinde çözüm olarak:

using ::testing::SetArgPointee; 

class MockMutator : public Mutator { 
    public: 
    MOCK_METHOD2(Mutate, void(bool mutate, int* value)); 
    ... 
}; 
    ... 

MockMutator mutator; 
EXPECT_CALL(mutator, Mutate(true, _)) 
    .WillOnce(SetArgPointee<1>(5)); 

Ama her iki ı örnek anlaşılmış değildi ya da bu case.Has herkes için geçerli değildi önce durum bu tür nereye ele?

Şimdiden teşekkürler.

+0

O zaman sorunun ne olduğunu anlamıyorum. Sorunlarını çözebilir misin? Kod benim için doğru gibi görünüyor. Veya referans parametresi için beklentileri benzer şekilde nasıl ayarlayacağınızı bilmek ister misiniz? ByRef() ', bunun için tamamıyla uygun olur. –

+0

+1, yemek kitabının örneklerinden almak zor. –

cevap

6

Sorunuzu almak zor! Google alaylarının 'yemek kitabı' örnekleri de öyle.

Uygulamanız, sınıf alayla birlikte Foo::myMethod() yeniden kullanmak mı yoksa belirli arama durumları için yan etkilerle (dönüş değeri ve ref parametreleriyle değiştirilmek) mi çalışmak istiyorsunuz?

bir sahte sınıf

genellikle/değiştirmek simüle sizin Foo sınıf, bunu doğrudan devralmak için değil anlamına gelir ya da davranış. Saf bir yöntem için bu 'varsayılan' davranışı tanımladığınız yöntemin işe yarayıp yaramayacağını bilemeyiniz, ancak bundan şüphe duyuyoruz. O zaman = 0'u atlayabilirsiniz. iyi bir yaklaşım gibi gerçek bir arayüz beyanı ayırmayı olacaktır: Eğer ikinci durum varsa

struct IFoo 
{ 
    virtual int myMethod(bool &my_boolean) = 0; 
    virtual ~IFoo() {} 
}; 

class Foo : public IFoo 
{ 
    // ... 
}; 

class MockFoo : public IFoo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
}; 

, sen testing::Return(value) ve testing::SetArgReferee<N>(value) ile kurtulmak gerektiğini (yani çok faydalı 'Cheat Sheet' bulunur).

Kişisel beklenti çağrısı bu o gibi görünmelidir:

MockFoo foo; 

// Expect call to myMethod() return -1 and set the by ref argument to true 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1))); 

// Expect call to myMethod() return 0 and set the by ref argument to false 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(false),Return(0))); 

gerçekten myMethod()'Delegating calls to a parent class', resp bir göz için orijinal sınıflar mantığı yeniden kullanmak istiyorum. 'Delegating Calls to a Real Object'

+0

Üzgünüm @ g-makulik Yanlış kod-pasajı kopyaladım, bu soruyla alakalı değildi. Şimdi düzelttim. –

+0

Maalesef, sorununuzu çözmem biraz zaman aldı. ByRef() 'bu dava için yanlış yoldu. –

+0

@RodrigoVasconcelos Artık ilgilenmiyor musunuz? Bu problemlerinizi çözüyor mu? –

İlgili konular