2011-09-05 10 views
5

Testuję prawdziwe połączenia z serwisem WWW przy pomocy OCMock.Opóźniony mechanizm OCMock weryfikujący/radzący sobie z przekroczeniem limitu czasu w testach jednostkowych

Teraz robię coś odczuwalna:

- (void)testWebservice 
{ 
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)]; 
    [[mydelegatemock expect] someMethod:[OCMArg any]]; 

    [SUT sutWithDelegate:mydelegatemock]; 

    // we need to wait for real result 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 

    [(OCMockObject*)mydelegatemock verify]; 
} 

to działa dobrze, ale to oznacza, że ​​każde takie badanie odbędzie 2 sekundy.

Czy mogę ustawić limit czasu? 2 sekundy, i od razu zadzwonić pod numer someMethod z i zakończyć testowanie?

Odpowiedz

5

zrobić to za pomocą poręczną funkcję użytkową znalazłem at this link:

#import <Foundation/Foundation.h> 
#import <OCMock/OCMock.h> 

@interface TestUtils : NSObject 
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay; 
@end 

i wdrożenie:

#import "TestUtils.h" 
@implementation TestUtils 

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay 
{ 
    NSTimeInterval i = 0; 
    while (i < inDelay) 
    { 
     @try 
     { 
      [inMock verify]; 
      return; 
     } 
     @catch (NSException *e) {} 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     i+=0.5; 
    } 
    [inMock verify]; 
} 

@end 

To pozwala mi czekać aż do maksymalnego opóźnienia (w sekundach) bez oczekiwanie pełnej kwoty za każdym razem.

+2

Być może pochodzi tutaj? ... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html –

+1

Dzięki Max - to wygląda jak źródło. Zaktualizowałem oryginalną odpowiedź z linkiem do oryginału. –

1

Chciałbym oddzielić testowanie funkcjonalne twoich usług internetowych (jeśli to konieczne w ogóle) od testowania jednostki twojej klasy, która przetwarza wynik usługi sieciowej.

Aby przetestować urządzenie, należy sfałszować wywołanie usługi internetowej, podając fałszywy wynik. Następnie twój test sprawdzi, czy z tego dobrze zdefiniowanego wyniku twoja klasa zachowuje się odpowiednio.

Jeśli chcesz również przeprowadzić testowanie funkcjonalne swojej usługi internetowej (powiedz, że zwraca konkretną odpowiedź pod pewną prośbą), nie musisz niczego drwić - po prostu zadzwoń do usługi i poproś o potwierdzenie wyniku.

Oddzielając swoje testy, masz lepszą kontrolę nad przebiegami testowymi. Na przykład, możesz uruchomić szybkie testy jednostkowe za każdym razem, gdy zmieniasz kod, ale uruchamiasz wolno działające testy funkcjonalne na noc, na dedykowanym serwerze lub w razie potrzeby. A kiedy test się zepsuje, będziesz wiedział, czy to twój kod, czy coś nie tak z usługą sieciową.

+2

Mam już testy w puszkach z natychmiastowymi fałszywymi zwrotami z usługi internetowej. Pytanie dotyczyło testów integracyjnych z prawdziwą usługą sieciową. Przyznaję, że mogłem odłożyć tę stronę na bok, ale nie zmienia to faktu, że muszę jakoś poczekać na wynik. I: z wynikami w puszkach nie testuję opóźnienia między żądaniem a wynikiem, tak jak w przypadku wyników w puszkach, delegat wynikowy faktycznie jest wywoływany * przed * wywołanie żądania jest zakończone. – fabb

Powiązane problemy