2009-01-29 1 views
7

Ich möchte etwas Code mit OCMock testen.Wie kann ich OCMock-Objekte mit Code verwenden, der isKindOfClass aufruft?

Die Innereien des Codes rufen [NSObject isKindOfClass] auf dem Mockobjekt ich auf den Code bereitstellt bin, etwa so:

if ([object isKindOfClass:[FancyClass class]]) { ...} 

Allerdings, wenn ich eine OCMockObject-basierte Mock wie diese erstellt bieten:

mock = [OCMockObject mockForClass:[FancyClass class]]; 

Es scheint, dass es den isKindOfClass Test nicht besteht.

Irgendwelche Vorschläge?

+1

Viel Zeit seit dieser Frage bestanden hat, und es ist immer noch relevant. Ich stimme nicht mit der Antwort überein, dass Sie isKindOfClass nicht verwenden sollten, sondern nur nach dem Protokoll suchen. Es erzwingt "Duck-Typisierung" anstelle von reinem Polymorphismus, was ein akzeptabler Stil sein sollte. Ich würde erwarten, dass die OCMock isKindOfClass Test bestehen ... – yonix

Antwort

7

Die allgemeine Regel ist, dass wenn Sie isKindOfClass: aufrufen und Sie nicht eine der PLIST-Klassen übergeben (z. B. NSString oder NSNumber), tun Sie es falsch.

Wenn die Methode hat zwei oder mehr verschiedene Dinge je nachdem, welche Klasse sein Argument ist, zerreißt er in mehrere Methoden und jede Methode separat testen.

Wenn die Methode funktioniert nur eine Sache, aber hat mit dem Objekt unterschiedlich, je nachdem, welcher Klasse zu interagieren ist, dann gilt:

  1. ein Protokoll machen. (Protokolle in Obj-C heißen "Schnittstellen" in einigen anderen OO-Sprachen, wie z. B. Java.)
  2. Machen Sie die vielen Klassen alle konform mit dem Protokoll. Verwenden Sie ggf. Kategorien, um die erforderlichen Methoden von außen hinzuzufügen.
  3. Machen Sie das Verfahren unter Testprüfung auf Übereinstimmung mit dem Protokoll, anstelle der aktuellen isKindOfClass: überprüfen.
  4. Machen Sie die zu testende Methode mit den Methoden des Protokolls.
+3

Die Liste der Vorschläge scheinen gut, aber ich würde nicht zustimmen, dass isKindofClass verwenden, sollten Basisklassen nehmen immer nur nicht richtig. Zum Beispiel ist es von großem Nutzen, wenn durch das Array geladen über Feder und der Suche nach der UITableViewCell Sie erstellt gehen ... –

+0

Wäre es nicht besser, zu testen, was Sie aus der Zelle benötigen, nicht dort, wo es sich befindet, in die Klassenhierarchie? (Ich kenne Cocoa Touch nicht, deshalb kann ich nicht spezifischer werden.) –

2

Was:

[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[FancyClass class]]; 
+0

Würdest du es erklären, um es leicht verständlich zu machen? – Gaim

+0

Dieser Code sagt in Englisch: "Immer wenn dieses Objekt (Mock) die Nachricht isKindOfClass mit Argument [FancyClass-Klasse] gesendet wird, geben Sie einfach YES" zurück. Mit anderen Worten täuschen alle, die behaupten, eine FancyClass-Instanz zu sein. –

+0

Sie können [Mock-Stub] verwenden, um das Objekt spezifische Dinge von beliebigen Methoden zurückgeben zu lassen, was beim Erstellen von Testszenarios nützlich ist und den ausgeübten Code von bestimmten Abhängigkeiten isoliert. –

Verwandte Themen