Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Testing asynchronous code on iOS with OCunit

Does anyone know of any existing library that allows testing asynchronous code with OCUnit? I'm thinking about something like GHAsyncTestCase but that delivers from SenTestCase.

I'm asking because if I don't find any I'm going to port GHAsyncTestCase to OCUnit but I don't want to duplicate work done already by someone else.

like image 816
Piotr Czapla Avatar asked Jan 13 '11 21:01

Piotr Czapla


People also ask

What is the test method to test an asynchronous operation in XCTest?

XCTest provides two approaches for testing asynchronous code. For Swift code that uses async and await for concurrency, you mark your test methods async or async throws to test asynchronously.


2 Answers

Piotr:

You might be interested in the work I've done with Mimic, a network stubbing tool written in Ruby which lets you stub requests at a high-level and can be used from your Objective-C using the supplied wrapper.

With regards to asynchronous testing, please take a look at a little utility I wrote called AssertEventually.

This example shows both Mimic and assertEventually in action.

In addition, you might want to look at Kiwi - it's a great little Objective-C testing framework that is built on top of OCUnit. I recently contributed a patch to port my AssertEventually behaviour over to Kiwi which lets you write things like:

id someObject = nil;
[do SomethingThatFetchesSomeObjectAsynchronously];
[[theObject(&someObject) shouldEventually] equal:@"some result"];
like image 107
Luke Redpath Avatar answered Sep 24 '22 14:09

Luke Redpath


AGAsyncTestHelper takes a slightly different approach than AssertEventually since it is evaluating the expression rather than checking the pointer for new results. One advantage of using AGAsyncTestHelper is that it can be used for blocks, delegate-callbacks and whatnot.

WAIT_WHILE(<expression_to_evaluate>, <max_duration>);

Answering the question

id someObject = nil;
[self doSomethingThatFetchesSomeObjectAsynchronously];
WAIT_WHILE(self.someObject == nil, 1.0); 
like image 31
hfossli Avatar answered Sep 22 '22 14:09

hfossli