2015-08-03 1 views
2

У меня есть следующий метод в моем приложении, для которого мне нужно написать блок-тесты.
Может ли кто-нибудь предложить, как я могу проверить, вызван ли блок успеха или блок ошибок.Единица тестового примера для методов обратного вызова ios

- (IBAction)loginButtonTapped:(id)sender 
{ 
    void (^SuccessBlock)(id, NSDictionary*) = ^(id response, NSDictionary* headers) { 
     [self someMethod]; 
    }; 

    void (^ErrorBlock)(id, NSDictionary*, id) = ^(NSError* error, NSDictionary* headers, id response) { 
     // some code 
    }; 

    [ServiceClass deleteWebService:@“http://someurl" 
           data:nil 
        withSuccessBlock:SuccessBlock 
        withErrorBlock:ErrorBlock]; 
} 

ответ

1

Вы должны использовать ожидания, относительно недавно введенный API. Они были добавлены для решения именно той проблемы, с которой вы сейчас сталкиваетесь, вызывается проверка обратных вызовов асинхронных методов.

Обратите внимание, что вы также можете установить тайм-аут, который повлияет на результат теста (например, медленные сетевые подключения могут подавать ложные срабатывания, если вы, конечно, не проверяете медленные соединения, хотя есть гораздо лучшие способы сделать это).

- (void)testThatCallbackIsCalled { 

    // Given 
    XCTestExpectation *expectation = [self expectationWithDescription:@"Expecting Callback"]; 

    // When 
    void (^SuccessBlock)(id, NSDictionary*) = ^(id response, NSDictionary* headers) { 

     // Then 
     [self someMethod]; 
     [expectation fulfill]; // This tells the test that your expectation was fulfilled i.e. the callback was called. 
    }; 

    void (^ErrorBlock)(id, NSDictionary*, id) = ^(NSError* error, NSDictionary* headers, id response) { 

    // some code 

    }; 

    [ServiceClass deleteWebService:@“http://someurl" 

              data:nil 

           withSuccessBlock:SuccessBlock 

           withErrorBlock:ErrorBlock]; 
    }; 

    // Here we set the timeout, play around to find what works best for your case to avoid false positives. 
    [self waitForExpectationsWithTimeout:2.0 handler:nil]; 

} 
+0

Но это будет модульный тест для метода «deleteWebService». Я ищу способ, которым я могу протестировать метод loginButtonTapped и проверить, вызван ли блок Success and Error. – Shubham

+1

Затем используйте фальшивую фреймворк (например, OCMock, OCMockito) и убедитесь, что вызывается «deleteWebService» при срабатывании действия «loginButtonTapped». Если у вас также есть «ожидание» модульного теста для обратного вызова, тогда вы охвачены, не так ли? – joakim

 Смежные вопросы

  • Нет связанных вопросов^_^