Xcode 3.2.3 , IOS4 et OCMock

Afin de tester nos développements iPhone nous utilisons largement les frameworks Google-Toolbox-for-Mac et OCMock (cf Tests unitaires et tests d’interface sur iPhone : État des lieux) Après la mise à jour du SDK4 et le passage à Xcode 3.2.3 nous avons eu une désagréable surprise : nos frameworks de tests ne compilaient plus et jusqu'à aujourd'hui on trouve très peu d'information sur la façon de régler ce problème. Voici comment nous nous y sommes pris :

L'erreur de build rencontrée est la suivante :

Undefined symbols: "_OBJC_CLASS_$_OCMockObject", referenced from: objc-class-ref-to-OCMockObject in WebServiceTest.o ld: symbol(s) not found

Jusqu'à maintenant nous ajoutions la bibliothèque OCMock.framework à la phase de build "Link Binary With Libraries". Il semble que l'on ne peut plus utiliser la version précompilée du Framework disponible dans la section téléchargement du site d’OCMock.

Pour faire fonctionner OCMock avec Xcode 3.2.3 vous devez :

  • Effacer ocmock.framework, ainsi que la phase "copy files" du build et toutes les références aux header de OCMock dans les "search path" de votre target.
  • Faire un check out de la dernière version sur le repository svn de OCMock : http://svn.mulle-kybernetik.com/OCMock/trunk
  • Faire un build de la target OCMockPhoneSim
  • Copier le fichier libOCMock.a et le répertoire Headers dans votre projet
  • Ajouter libOCMock.a aux framework de votre projet et ajouter un lien vers le répertoire Headers dans les "search path" de votre target de test

Vous buildez à nouveau et... rien ne se passe.

Apres OCMock c'est maintenant le script de Google-Toolbox-for-Mac qui reste bloqué indéfiniment sur cette erreur :

SBSetAccelerometerClientEventsEnabled failed: (ipc/ send) invalid destination port

Là encore la solution est de récupérer les sources de GTM sur le trunk du repository, puis de remplacer tous les fichiers nécessaires aux tests iPhone comme indiqué dans le guide d'installation :

http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting

Maintenant vous pouvez enfin relancer vos tests !