2012-03-06 4 views
5

Sto provando a utilizzare OCMock per la prima volta nei miei casi di test. Si tratta di un progetto Mac, sviluppato e rivolto a Lion, in Xcode 4.3. L'applicazione principale e il fascio di test entrambi hanno ARC acceso, e così ogni volta che eseguo i test che vedo il seguente messaggio di registro:Errore OCMock al runtime

GC: forcing GC OFF because OBJC_DISABLE_GC is set

va bene, come sto usando ARC così ho don' t cura di GC. Quando costruisco i miei test unitari, collegati all'ultima release stabile di OCMock (2.0.1), la build non ha problemi. In fase di esecuzione, dopo la dichiarazione di registro di cui sopra, ottengo il seguente:

The test bundle at /Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest could not be loaded because its Objective-C runtime information does not match the runtime information required by the test rig. This is likely because the test rig is being run with Objective-C garbage collection disabled, but the test bundle requires Objective-C garbage collection. To enable Objective-C garbage collection for the test rig, run it in an environment without the OBJC_DISABLE_GC environment variable. 2012-03-06 10:29:32.812 otest[8486:203] *** NSTask: Task create for path '/Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest/Contents/MacOS/___Tests' failed: 22, "Invalid argument". Terminating temporary process.

Il messaggio implica che la raccolta dei rifiuti è il colpevole più comune, ma come già detto, non c'è modo sto usando GC. Quindi, quali altre impostazioni potrebbero incasinarmi durante il runtime? Non pensavo di fare nulla di atipico, e ho verificato le impostazioni del mio progetto di test per essere sicuro, e non ho visto niente di strano.

Aggiornamento

sono stato in grado di riprodurre questo con un nuovo progetto vuoto.

  1. Creare un nuovo progetto e farlo creare test di unità, con ARC abilitato
  2. cancellare l'impostazione Test Host da impostazioni di generazione del fascio di test di unità
  3. Link al quadro OCMock
  4. esegue le prove e testimoniare lo stesso errore ho riportato sopra

Inoltre, quando spengo ARC e fare garbage collection richiesto, quindi 0.123.segnala un errore del linker mach-o, quindi la compilazione non riesce. Se rimuovo il collegamento al framework OCMock, funziona bene. Questo supporta il mio pensiero iniziale che il problema si trova in un luogo diverso dalla raccolta dei rifiuti.

+0

Si dice che non è probabile lavorare perché GC è spento. "il bundle di test richiede la garbage collection di Objective-C". Quindi prova a non impostare OBJC_DISABLE_GC. – vakio

+0

@vakio il "test bundle" è il mio codice di test e utilizza ARC, motivo per cui GC è disabilitato. Quel messaggio è solo un suggerimento su ciò che di solito è sbagliato nell'ambiente di runtime. Ho provato ad abilitare GC, ma LLVM fallisce, probabilmente perché ARC e GC non possono coesistere. – Dov

risposta

18

ho trovato la risposta, dopo una giornata di ricerca tutto quello che mi veniva in mente, nel Hamcrest tutorial (leggere più attentamente attraverso il OCMock tutorial collegato da OCMock.org, è menzionato anche lì). Per qualche ragione, i framework di Hamcrest e OCMock devono essere copiati nella directory dei prodotti. Quindi tutto funziona come un fascino.

  1. Vai alle impostazioni per le prove fascio
  2. Vai agli fasi di creazione scheda
  3. Fare clic sul Fase tasto Add Genera e selezionare Aggiungere Copia file
  4. impostare il nuovo Copia file Fasi di creazione 'Destinazione a Elenco prodotti
  5. Trascina OCMock.quadro dal contorno progetto nella lista dei file per la fase
  6. Trascinare la fase di copia di file al di sopra del Esegui script fase

eseguire il test come al solito

+1

Sia OCHamrest che OCMock sono costruiti con '@ rpath' nel percorso del caricatore. Questo fa sì che funzionino nella directory dei prodotti perché questo è sul percorso per impostazione predefinita. Puoi usare 'LC_RPATH' e altri mezzi per darti più flessibilità. Vedi la discussione di '@ rpath' nella pagina man di' dyld'. –

+0

Interessante, grazie per la spiegazione. – Dov

+0

Ho avuto lo stesso problema con il mio progetto, che include il framework Growl. La soluzione è stata la stessa, grazie! – mrwalker