2016-03-23 9 views
1

Ich habe zwei Klassen.Überprüfen, ob eine Methode von einem anderen Objekt aufgerufen wurde OCMock

Objekt 1:

- (void) methodA { 
    ObjectB objectB = [[ObjectB alloc] init]; 
    [objectB methodB]; 
} 

Und 2 Objekt

- (void) methodB { 
    // Does something 
} 

Mit OCMock, wie kann ich überprüfen, dass methodA Anrufe methodB? Ich gründe den Test auf wie folgt aus:

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

Die Testklasse testet object1, aber ich möchte sicherstellen, dass sie das Verfahren auf object2 aufruft. Wenn Sie diesen Test ausführen, bekomme ich die fehlerhafte Nachricht:

Method methodB was not invoked. 

ich Mocks/Stubs noch wirklich neu bin. Es ist durchaus möglich, dass ich den Test falsch strukturiere. Der Schein verwirrt mich etwas, weil ich Object1 teste, aber versuche, etwas auf Object2 zu überprüfen.

Denke ich richtig, wenn ich diesen Test aufstelle? Wenn nicht, wie soll ich das angehen?

Antwort

0

Sie müssen sicherstellen (irgendwie), dass Object1 die Schein und nicht eine neue Instanz von ObjectB verwendet. Der übliche Ansatz, dies zu tun, ist die Abhängigkeitsinjektion, d. Object1 hat eine Abhängigkeit von Object2, aber anstatt Object1 eine Instanz von Object2 zu erstellen, wird die Instanz von Object2 von außen gesetzt (injected). Es gibt eine Menge Zeug darüber im Internet.

Mit OCMock können Sie sich diesen Weg auf andere Weise hacken. Dies wird jedoch nicht empfohlen. Sie könnten alloc/init durch new ersetzen, dann stub die Klassenmethode new, um den Schein zurückzugeben. Auf diese Weise würde Objekt1 den Schein verwenden, ohne es zu wissen. Es würde immer noch "denken", dass es eine neue Instanz von Object2 zugewiesen hat.

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock new]).andReturn(mock); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

Dies wird in der Referenzdokumentation in 9.3 erwähnt. Stubbing-Methoden, die Objekte erstellen.