Wie teste ich Unit-Test für EXC_BAD_ACCESS?

9

Ich weiß, wie man EXC_BAD_ACCESS-Probleme löst, aber ich bin mir nicht sicher, wie man Unit-Tests dafür durchführt. Gibt es eine Möglichkeit, EXC_BAD_ACCESS im Code zu erfassen, anstatt einfach abzustürzen?

Hier ist der Grund, warum ich frage: Ich habe eine Bibliothek geschrieben, die Blöcke wie folgt verwendet:

%Vor%

In meiner Implementierung von doSomething: werde ich den Block schließlich so ausführen:

%Vor%

Wenn ein Aufrufer nil für den Block übergibt, wird er mit EXC_BAD_ACCESS abstürzen, also ist es die Lösung zu prüfen, ob der Block existiert:

%Vor%

Dieser Null-Check ist ziemlich einfach zu vergessen, also würde ich gerne einen Komponententest schreiben, der fehlschlägt, wenn der Absturz auftritt. Ich nehme an, ein Absturz könnte als Testfehler betrachtet werden, aber ich denke, es wäre für andere netter, wenn sie versuchen würden, die Tests auszuführen, um eine nette Fehlermeldung statt eines Absturzes zu sehen. Irgendwelche Ideen?

    
greenisus 12.11.2011, 21:30
quelle

2 Antworten

4

Ich denke, Sie müssen den Test in einem Subprozess ausführen; dann können Sie den Subprozess abstürzen lassen, nach diesem Absturz suchen und den Test ordentlich abbrechen, wenn er auftritt.

Arbeiten Sie von Peter Hoseys Singleton-Testcode .

%Vor%

Jeder Test wird dann in einem Subprozess wie folgt ausgeführt:

%Vor%

Möglicherweise müssen Sie dies optimieren; Ich habe es nicht getestet.

    
Josh Caswell 12.11.2011, 22:12
quelle
1

Ich würde vorschlagen, eines der Assertion-Makros zu verwenden, die in Programmierhandbuch für Behauptungen und Protokollierung

Sie könnten also etwas tun wie:

%Vor%

Dies erzwingt die Voraussetzungen, die erfüllt sein müssen, bevor die Methode weiter ausgeführt wird. Es ermöglicht auch die App zum Absturz und gibt Ihnen einen Grund, warum außer EXEC_BAD_ACCESS.

    
Brandon A 12.11.2011 22:11
quelle