7

का उपयोग करते समय एक्सकोड में काम करते हैं, मैं अपने ऐप में कीचेन सेवाओं का उपयोग करने के लिए SFHFKeychainUtils का उपयोग कर रहा हूं। मैंने कुछ ओसीयूनीट परीक्षण लिखे हैं जो इस कोड की funcionality सत्यापित करते हैं। जब मैं आईओएस सिम्युलेटर या मेरे डिवाइस पर एक्सकोड से यूनिट परीक्षण चलाता हूं तो सब ठीक काम करता है। हालांकि अब मैं एक सीआई सर्वर स्थापित करने की कोशिश कर रहा हूं और जब यह त्रुटि कोड -25291 के साथ कमांड लाइन के माध्यम से चलाया जाता है तो परीक्षण विफल हो रहा है। ऐप्पल के दस्तावेज पर यह देखकर मुझे बताया गया है: कोई ट्रस्ट परिणाम उपलब्ध नहीं है (errSecNot उपलब्ध नहीं है)। मैंने अपनी यूनिट टेस्ट प्रोजेक्ट में सुरक्षा.फ्रेमवर्क को लिंक किया है, ऐसा लगता है कि मैंने वेब पर जो पढ़ा है, वैसे ही मुझे यह काम करने की ज़रूरत है। यहाँ आदेश मैं कंसोल में लागू कर रहा हूँ है:OCUnit परीक्षण कमांड लाइन से विफल हो जाते हैं लेकिन कीचैन सेवा

/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug

किसी कमांड लाइन से एक साथ अच्छी तरह से खेलने के लिए इकाई परीक्षण और कीचेन सेवाएं प्राप्त करने के लिए किसी भी अनुभव या सुझाव हैं?

+0

आप बिना सिर मोड में सीआई सर्वर चला रहे हैं, या आप एक सक्रिय उपयोगकर्ता सत्र है? –

+0

मेरे पास एक सक्रिय उपयोगकर्ता सत्र है। –

+0

बहुत अजीब, क्या आप पुष्टि कर सकते हैं कि आपके पास कीचेन तक पहुंच है, यानी यह पासवर्ड सुरक्षित नहीं है? –

उत्तर

8

मैं एक ही मुद्दे में भाग गया, और मेरे लिए समाधान यह सुनिश्चित करना था कि कोई परीक्षण शुरू करने से पहले सिम्युलेटर चल रहा था। मैंने एक्सकोड में रन स्क्रिप्ट बिल्ड चरण में ऐप्पलस्क्रिप्ट का उपयोग किया, और अनिवार्य रूप से सीआई सर्वर पर एक ही चीज़। यहाँ खोल स्क्रिप्ट है कि सिम्युलेटर खुलेगा:

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

सुरक्षा/कीचेन सेवाओं मुद्दा यह है कि कारण बनता है यह जाहिरा तौर पर एक ज्ञात समस्या है, हालांकि मेरे पास अभी तक रडार नहीं है जो इसे ट्रैक करता है। यदि आप जेनकींस का उपयोग कर रहे हैं, तो अपने एक्सकोड बिल्ड चरण से पहले उपरोक्त स्क्रिप्ट को निष्पादन शैल चरण में रखें। यदि आप इसे एक्सकोड के माध्यम से नियंत्रित कर रहे हैं, तो RunUnitTests रन स्क्रिप्ट बिल्ड चरण से पहले इसे रन स्क्रिप्ट बिल्ड चरण में रखें। आशा है कि आपकी समस्या हल हो जाए!

+0

आपको धन्यवाद। इस मुद्दे को गुगल करने से पहले मेरे समय का एक घंटा चला गया। जैसा कि आपने सुझाव दिया था, स्क्रिप्ट ठीक उसी तरह काम करती थी। – makdad

+0

क्लीलीश - आप वैक्ससिम प्रोजेक्ट को चेकआउट करना चाहेंगे। यह आपको कमांड लाइन से सिम्युलेटर लॉन्च करने की अनुमति देता है। https://github.com/square/WaxSim/ - इसके अलावा आप किसी भी सक्रिय सिम्स 'ps aux को मारने के लिए निम्न का उपयोग कर सकते हैं। grep -e 'आईफोन सिम्युलेटर.एप' | grep -v grep | अजीब '{प्रिंट $ 2}' | xargs kill -9 ' –

+1

@ स्टुअर्ट ... जटिल grep और aux समाधान के बजाय ... आप "killall -9" iPhone Simulator' " –

1

मैं यह पता लगाने में सक्षम नहीं था कि ओसीयूनीट परीक्षण कमांड लाइन से चलाए जाने पर कीचेन पहुंच क्यों विफल हो जाती है।

आदेश मेरा परीक्षण के साथ आगे बढ़ने के लिए मैं अपने इकाई परीक्षण लक्ष्य के लिए एक hacktastic श्रेणी कहा:

// 
// SFHFKeychainUtils+UnitTestHacks.m 
// CB30 
// 
// GRRR!!! http://stackoverflow.com/questions/9996578/ocunit-tests-fail-from-the-command-line-but-work-in-xcode-when-using-keychain-se 
// 
// Created by Joshua Vickery on 5/14/12. 
// 

#import "SFHFKeychainUtils+UnitTestHacks.h" 

static NSMutableDictionary *fakeKeyChainHolder; 

@implementation SFHFKeychainUtils (UnitTestHacks) 

+ (NSMutableDictionary *)fakeKeyChainForServiceName:(NSString *)serviceName { 
    if (nil == fakeKeyChainHolder) { 
     fakeKeyChainHolder = [NSMutableDictionary dictionary]; 
    } 

    NSMutableDictionary *fakeKeyChain = [fakeKeyChainHolder objectForKey:serviceName]; 
    if (nil == fakeKeyChain) { 
     fakeKeyChain = [NSMutableDictionary dictionary]; 
     [fakeKeyChainHolder setObject:fakeKeyChain forKey:serviceName]; 
    } 
    return fakeKeyChain; 
} 

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 

+ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{ 
    [[self fakeKeyChainForServiceName:serviceName] removeObjectForKey:username]; 
    return YES; 
} 


+ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error 
{ 
    [[self fakeKeyChainForServiceName:serviceName] setObject:password forKey:username]; 
    return YES; 
} 

+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{ 
    return [[self fakeKeyChainForServiceName:serviceName] objectForKey:username]; 
} 

#pragma clang diagnostic pop 

@end 

कृपया ध्यान दें कि यह एक अच्छा समाधान है, लेकिन एक काम के आसपास इकाई परीक्षण पाने के लिए एक जब तक काम नहीं कर रहा है बेहतर समाधान मिला है।

+1

मैं अभी भी इस तरह से सोचता हूं कि यह एक अच्छा समाधान है क्योंकि आप प्रभावी ढंग से ढांचे को मजाक कर रहे हैं, यूनिट परीक्षण में कभी भी बुरी चीज नहीं .. – makdad

0

मुझे एक ही समस्या का सामना करना पड़ रहा है। मेरे शोध से यह सिम्युलेटर संस्करण पर आ सकता है जो परीक्षण चल रहा है जब चल रहा है। आईफोन सिम्युलेटर 6.0 अप के साथ यूनिट परीक्षण कीचेन कमांड लाइन से चलने पर हमेशा मेरे परीक्षण विफल हो जाएगी। इसे किसी भी अन्य संस्करण (4.3, 5.0, 5.1) में बदलें और वे पास हो जाते हैं। हालांकि किसी भी संस्करण के साथ एक्सकोड से हमेशा अच्छा है।

शायद यह एक कमांड लाइन उपकरण समस्या है जो परीक्षण चलाने से पहले कुछ आवश्यक झंडे स्थापित नहीं कर रही है।

मैं एक छोटे से परीक्षण मामले के साथ यहां एक नया सवाल खोल दिया: Keychain Services API fails with errSecNotAvailable in iphonesimulator 6.0