2012-12-18 16 views
30

için varsayılan eylemi belirtirken, ON_CALL ve EXPECT_CALL arasındaki farkı anlamıyorum.gmock ayarı varsayılan eylemleri/ON_CALL vs. EXPECT_CALL

Şimdiye kadar/fark bir mock varsayılan işlemi ayarlamak için iki yol vardır öğrendim:

ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 

veya

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

birisi bana açıklayabilir misiniz:

  • İki yöntem arasındaki fark
  • İnişler ve çıkışlar Dediğin gibi, bu iki satır tam olarak aynı şeyi yapıyoruz

cevap

29

. EXPECT_CALL, sahte aramalarda beklentiyi ayarlar.

EXPECT_CALL(mock, methodX(_)).WillRepeatedly(do_action); 

Yazma methodXmock üzerinde herhangi argümanlarla kez herhangi bir sayı olarak adlandırılan olabileceği gMock söyler ve o zaman, mockdo_action seslendirecek. Öte yandan,

ON_CALL(mock, methodX(_)).WillByDefault(do_action); 

methodX mock üzerine çağrıldığı taktirde, bu do_action gerçekleştirmek gerektiğini gMock söyler. Bu özellik, alayla ilgili birçok beklenti yazmanız gereken bir senaryoda yardımcı olur ve çoğu/hepsi aynı eylemi belirtmelidir - özellikle de karmaşıksa. Bu eylemi ON_CALL'da belirtebilir ve eylemi açıkça belirtmeden EXPECT_CALL s yazabilirsiniz. Örneğin.İşaret döner varsayarak başka örnekte

EXPECT_CALL(mock, Sign(-4, _)); 
EXPECT_CALL(mock, Sign(0, _)); 
EXPECT_CALL(mock, Sign(1, _)).Times(2); 
EXPECT_CALL(mock, Sign(2, _)); 
EXPECT_CALL(mock, Sign(3, _)); 
EXPECT_CALL(mock, Sign(5, _)); 

: Eğer EXPECT_CALL s çok yazmak varsa Asistan

ON_CALL(mock, Sign(Eq(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is zero"), Return(0))); 
ON_CALL(mock, Sign(Gt(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is positive"), Return(1))); 
ON_CALL(mock, Sign(Lt(0), _)) 
    .WillByDefault(DoAll(SetArgPointee<1>("argument is negative"), Return(-1))); 

, sen 'davranışı her zaman belirtmek mock gerekmez int, sen

ON_CALL(mock, Sign(Gt(0), _)).WillByDefault(Return(1)); 
EXPECT_CALL(mock, Sign(10, _)); 

yazarsanız çağrı mock.Sign(10)ON_CALL olarak 1 için varsayılan davranış sağlar dönecektir EXPECT_CALL tarafından belirtilen arama. Eğer

EXPECT_CALL(mock, Sign(Gt(0), _).WillRepeatedly(Return(1)); 
EXPECT_CALL(mock, Sign(10, _)); 

yazarsanız Ama mock.Sign(10, p) çağırma İkinci beklenti karşı eşleştirilecek 0 döndürür. Bu beklenti açık bir eylem belirtmez ve gMock bunun için varsayılan bir eylem oluşturur. Bu varsayılan eylem, int için 0 olan dönüş türünün varsayılan değerini döndürmektir. Bu durumda ilk beklenti tamamen göz ardı edilecektir.

7
ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01)); 
EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); 

her biri

  • arasında zaman (... kurulum ne tür) verilmesinin uygun olduğuna kullanmaktır, bu nedenle farklılıklar vardır hiç Dilediğiniz gibi varsayılan bir eylem ayarlamak için iki yol kullanın.

    Ancak mantıksal bir fark vardır:

    • ON_CALL(mock, methodX(_)).WillByDefault(Return(0x01));

      yöntem olarak adlandırılabilir anlamına gelir ve bu olursa, her çağrı 0x01
    • EXPECT_CALL(mock, methodX(_)).WillRepeatedly(Return(0x01)); dönecektir bunun beklendiğini demektir yöntem olacak o çağrılabilir ve her çağrı arada 0x01

    dönecektir, onların ch bir Setting default actions var diyor levha, yemek:

    belirli yöntem için varsayılan eylemi özelleştirmek için ON_CALL() kullanın: iki ifade arasındaki ince ama anlamlı farklar vardır

    ON_CALL(mock_object, method(matchers)) 
        .With(multi_argument_matcher) ? 
        .WillByDefault(action); 
    
  • +0

    Ancak daha önce bir EXPECT_CALL ile ON_CALL ile tanımlanan varsayılan eylemi geçersiz kılmaya çalıştığımda işe yaramaz gibi görünüyor. Herhangi bir fikir? – Nicoretti

    +2

    @Nicoretti Hayır, işe yaramıyor. İkisini de kurarsan ne olacağından bile emin değilim. Belki bu durumda sadece bir kişi idam edilir. BTW'nin, bir varsayılan davranışı nasıl belirleyeceğinizi açıklayan bir [bölüm] (http://code.google.com/p/googlemock/wiki/CheatSheet#Setting_Default_Actions) var. –

    +0

    evet bunu gördüm ama EXPECT_CALL'in varsayılan davranışı değiştirmek için kullanılabileceğinden merak ettim ve kafam karıştı. Ve doktorlar, her ikisini de kullanırken yan etkiler/öncelik hakkında bir şey söylemiyorlar. – Nicoretti

    İlgili konular