2013-08-29 16 views
7

Ho un metodo che vorrei testare con OCMock ma non sono sicuro di come farlo. Ho bisogno di prendere in giro ExtClass che non è definito come parte del mio codice (libreria esterna):Come si deride un oggetto con OCMock che non viene passato come parametro al metodo?

+(NSString *)foo:(NSString *)param 
{ 
    ExtClass *ext = [[ExtClass alloc] initWithParam:param]; 
    if ([ext someMethod]) 
     return @"A"; 
    else 
     return @"B"; 
} 

Grazie in anticipo!

+1

Il tipo di restituzione del metodo è BOOL e quindi si restituisce una stringa. Potresti modificare e cambiare una di quelle cose? Immagino tu voglia restituire una stringa, ma non ne sono sicuro. – e1985

+0

Grazie. L'ho risolto. – soguy

risposta

19

OCMock 2

id mock = [OCMockObject mockForClass:[ExtClass class]]; 
// We stub someMethod 
BOOL returnedValue = YES; 
[[[mock stub] andReturnValue:OCMOCK_VALUE(returnedValue)] someMethod]; 

// Here we stub the alloc class method ** 
[[[mock stub] andReturn:mock] alloc]; 
// And we stub initWithParam: passing the param we will pass to the method to test 
NSString *param = @"someParam"; 
[[[mock stub] andReturn:mock] initWithParam:param]; 

// Here we call the method to test and we would do an assertion of its returned value... 
[YourClassToTest foo:param]; 

OCMock3

// Parameter 
NSURL *url = [NSURL URLWithString:@"http://testURL.com"]; 

// Set up the class to mock `alloc` and `init...` 
id mockController = OCMClassMock([WebAuthViewController class]); 
OCMStub([mockController alloc]).andReturn(mockController); 
OCMStub([mockController initWithAuthenticationToken:OCMOCK_ANY authConfig:OCMOCK_ANY]).andReturn(mockController); 

// Expect the method that needs to be called correctly 
OCMExpect([mockController handleAuthResponseWithURL:url]); 

// Call the method which does the work 
[self.myClassInstance authStarted]; 

OCMVerifyAll(mockController); 

Note

garantire che, in entrambi i casi si stub due metodi (alloc e il metodo init...). Inoltre, assicurati che entrambe le chiamate di stub vengano effettuate sull'istanza della classe mock (non sulla classe stessa).

Documenti: metodi di classe sezione nel Questa soluzione OCMock features

Alternative

(strano) può essere utile nel caso in cui si vogliono testare codice legacy che a causa di qualsiasi ragione non si può refactoring. Tuttavia, se è possibile modificare il codice, è necessario refactarlo e ottenere un oggetto ExtClass come parametro, non una stringa, delegando la creazione di ExtClass a tale metodo. Il tuo codice di produzione e test sarebbe più semplice e chiaro, specialmente in un caso di vita reale più complesso, non in questo semplice esempio.

+0

Grazie! Sembra buono. Lo proverò. – soguy

+0

E 'possibile restituire un oggetto/mock distinto per ogni 'alloc'? Ciò sembra necessario per mantenere diverse istanze con valori diversi di 'param' (ad esempio' ExtClass' con semantica normale/non singleton). Vedi domanda correlata [qui] (http://stackoverflow.com/questions/28240858/how-to-partially-mock-an-object-inside-legacy-code-with-ocmock). Grazie. – Drux

+0

Sembra che non funzioni con OCMock versione 3, ma potrei sbagliarlo. –

Problemi correlati