SORU
29 Ocak 2010, Cuma


Nasıl test zaman uyumsuz API birim için?

Böyle büyük mükafat içine Google Toolbox for Mac yüklü ve talimatları ünite testi here buldu kurmak için takip ettim.

Tüm iyi çalışıyor, ve tüm nesneleri çok iyi bir zaman uyumlu yöntemlerimi test edebilirsiniz. Ancak, en karmaşık API gerçekten istediğim için test sonuçların uyumsuz üzerinden arama yöntemi bir temsilci için örnek bir arama için bir dosya indirme ve güncelleme sistemi döndürecektir hemen sonra run -fileDownloadDidComplete: yöntem dosya indirme tamamlanır.

Nasıl bir birim test bu test istiyorsunuz?

'Dur' fileDownloadDidComplete için: çalıştırmak için yöntem. testDownload işlevi, ya da en azından test çerçeve yapmak istiyorum gibi görünüyor

EDİT: şimdi böyle büyük mükafat-dahili XCTest sistemi kullanarak açık ettik ve Github TVRSMonitor ölü kolay semafor zaman uyumsuz işlemler için beklemek kullanmak için bir yol sağlar.

Örneğin:

- (void)testLogin {
  TRVSMonitor *monitor = [TRVSMonitor monitor];
  __block NSString *theToken;

  [[Server instance] loginWithUsername:@"foo" password:@"bar"
                               success:^(NSString *token) {
                                   theToken = token;
                                   [monitor signal];
                               }

                               failure:^(NSError *error) {
                                   [monitor signal];
                               }];

  [monitor wait];

  XCTAssert(theToken, @"Getting token");
}

CEVAP
11 NİSAN 2010, Pazar


Aynı soru ile karşılaştım ve benim için çalışan farklı bir çözüm buldu.

"Eski okul" şöyle: bir semafor kullanarak senkronizasyon bir akış içinde zaman uyumsuz işlemler için dönüm yaklaşım . ı kullanın

// create the object that will perform an async operation
MyConnection *conn = [MyConnection new];
STAssertNotNil (conn, @"MyConnection init failed");

// create the semaphore and lock it once before we start
// the async operation
NSConditionLock *tl = [NSConditionLock new];
self.theLock = tl;
[tl release];    

// start the async operation
self.testState = 0;
[conn doItAsyncWithDelegate:self];

// now lock the semaphore - which will block this thread until
// [self.theLock unlockWithCondition:1] gets invoked
[self.theLock lockWhenCondition:1];

// make sure the async callback did in fact happen by
// checking whether it modified a variable
STAssertTrue (self.testState != 0, @"delegate did not get called");

// we're done
[self.theLock release]; self.theLock = nil;
[conn release];

Çağırmak için emin olun

[self.theLock unlockWithCondition:1];

Temsilci(ler).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • captainpuppys2000

    captainpuppy

    20 HAZİRAN 2013
  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • metagamers

    metagamers

    13 Mayıs 2006