2012-04-24 14 views
6

Bir OCMock nesnesine gönderilen argümanı nasıl yakalayacağını bilen var mı?Bir alamaya gönderilen bir argümanı nasıl ele geçiririm?

id mock = [OCMockObject mockForClass:someClass] 
NSObject* captureThisArgument; 
[[mock expect] foo:<captureThisArgument>] 

[mock foo:someThing] 
GHAssertEquals[captured, someThing, nil]; 

Bağımsız değişken doğrulamak için nasıl yapılır? Ben de sahte tanımdaki bir blok içinde yapmaktan mutluluk duyuyorum, ama eğer nesneyi çıkarabildiysem, böylece daha sonra bu özellik parlak olabilirdi.

Bu, OCMock ile mümkün mü?

cevap

9

Eğer böyle bir şey ile saplama ayarlarken ise belki doğrudan yapabilir parametrenizi doğrulamak isterseniz:

id mock = [OCMockObject mockForClass:someClass]; 
NSObject* captureThisArgument; 
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){ 
    // Capture argument here... 
}]]; 

Saygılarımızla, Quentin A

+0

Bunu beğendim. Groovy'de bir hancrest maççısı ile alay etmeye nasıl gideceğime benzer. Teşekkürler :). –

3

Aramayı saplama ve bunu doğrulayan bir bloğa bunu geçirebilirsiniz:

NSObject *expected = ...; 

id mock = [OCMockObject mockForClass:someClass] 
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { 
    NSObject *actual; 
    [invocation getArgument:&actual atIndex:2]; 
    expect(actual).toEqual(expected); 
}; 
[[[mock stub] andDo:theBlock] foo:[OCMArg any]]; 

[mock foo:expected]; 

Orada bu bir geri arama sürümü de, ama görünür olan bir devlet değişken ihtiyaç olarak denetim akışı, daha karmaşık bir hal alır testinizin ve doğrulama geri arama hem:

[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument] 
+1

Teşekkürler. @ Quentin'in cevabı ümit ettiğim özlüydi, ama ben de senin örneğini takdir ediyorum. Atak zamanlarında çoklu argümanların nasıl doğrulanacağına dair bir örnek olması iyi bir şeydir. (Bir şey doğru değilse, Block'ta iddialar atacağım). –

+0

NSInvocation öğesinin ilk iki argümanı kendiliğinden ve _cmd; Bir yönteme ait "ilk" argümanı, indeks 2'dir. – titaniumdecoy

+0

İyi yakalama @titaniumdecoy. Cevabımı güncelledi. –

İlgili konular