2013-08-29 4 views
7

मेरे पास एक तरीका है जिसे मैं ओसीएमॉक के साथ परीक्षण करना चाहता हूं लेकिन यह सुनिश्चित नहीं करता कि यह कैसे करें।ओसीएमॉक के साथ ऑब्जेक्ट का नकल कैसे करें जो विधि के पैरामीटर के रूप में पारित नहीं किया गया है?

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

अग्रिम धन्यवाद: मैं ExtClass जो मेरे कोड (बाह्य पुस्तकालय) के हिस्से के रूप में परिभाषित नहीं है उपहास करने के लिए की जरूरत है!

+1

आपकी विधि वापसी प्रकार BOOL है और फिर आप एक स्ट्रिंग लौट रहे हैं। क्या आप इनमें से किसी भी चीज को संपादित और बदल सकते हैं? मुझे लगता है कि आप एक स्ट्रिंग वापस करना चाहते हैं, लेकिन मुझे यकीन नहीं है। – e1985

+0

धन्यवाद। मैंने इसे ठीक कर दिया है। – soguy

उत्तर

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); 

नोट्स

सुनिश्चित करें कि दोनों ही मामलों में आप दो विधियों (alloc और init... विधि) ठूंठ। साथ ही, सुनिश्चित करें कि दोनों स्टबिंग कॉल क्लास मॉक के इंस्टेंस पर (कक्षा स्वयं नहीं) पर बनाई गई हैं।

डॉक्स: कक्षा तरीकों मामले में OCMock features

वैकल्पिक

यह (अजीब) समाधान में अनुभाग उपयोगी हो सकता है आप विरासत कोड है कि जो भी कारण की वजह से आप refactor नहीं कर सकते हैं परीक्षण करना चाहते हैं। हालांकि, अगर आप कोड को संशोधित कर सकते हैं तो आपको इसे दोबारा प्रतिक्रिया देना चाहिए और ExtClass ऑब्जेक्ट को एक पैरामीटर के रूप में प्राप्त करना चाहिए, स्ट्रिंग नहीं, उस विधि से ExtClass के निर्माण को दर्शाता है। आपका उत्पादन और परीक्षण कोड सरल और स्पष्ट होगा, खासकर एक जटिल वास्तविक जीवन मामले में, इस सरल उदाहरण में नहीं।

+0

धन्यवाद! अछा लगता है। मैं इसका परीक्षण करूंगा। – soguy

+0

क्या प्रत्येक 'alloc' के लिए एक विशिष्ट वस्तु/नकली वापस करना संभव है? यह 'param' के विभिन्न मूल्यों के साथ कई उदाहरणों को बनाए रखने के लिए आवश्यक लगता है (यानी सामान्य/गैर-सिंगलटन अर्थशास्त्र के साथ 'ExtClass')। संबंधित प्रश्न देखें [यहां] (http://stackoverflow.com/questions/28240858/how-to-partially-mock-an-object-inside-legacy-code-with-ocmock)। धन्यवाद। – Drux

+0

यह ओसीएमॉक संस्करण 3 के साथ काम नहीं कर रहा है, लेकिन मैं इसे गलत कर सकता हूं। –

संबंधित मुद्दे

 संबंधित मुद्दे