iOS - 'MyProject-Swift.h' फ़ाइल स्विफ्ट के लिए यूनिट टेस्ट चलाते समय नहीं मिली


94

मैं अपने प्रोजेक्ट के लिए यूनिट टेस्टिंग सेटअप करने की कोशिश कर रहा हूं। यह एक मौजूदा ऑब्जेक्टिव-सी ऐप है, जिसे मैंने हाल ही में एक स्विफ्ट क्लास में जोड़ा है। मेरे पास 'MyProject-Swift.h' और Swift Bridging फ़ाइलें ('MyProject' और 'MyProjectTest' दोनों) सेटअप हैं और मैं उद्देश्य-सी और स्विफ्ट कोड दोनों का उपयोग करके एप्लिकेशन को ठीक से बनाने और चलाने में सक्षम हूं।

हालांकि, अब मैं नई स्विफ्ट क्लास पर कुछ यूनिट टेस्ट चलाना चाहता हूं। मैंने अपनी परीक्षण फ़ाइल सेटअप की है और यह निम्नलिखित की तरह दिखता है:

MySwiftClassTests.swift:

import UIKit
import XCTest
import MyProject

class MySwiftClassTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}

टेस्ट के रूप में ऐप चलाते समय मुझे यह त्रुटि मिलती है:

'MyProject-Swift.h' file not found

मुझे यकीन नहीं है कि यह केवल टेस्ट चलाने की कोशिश करने पर ही क्यों होता है। कोई सुझाव?


1
इस पर अपडेट जोड़ें? मैं एक ही समस्या का सामना कर रहा हूँ ...
hyouuu

1
@Coveloper - आप '-Swift.h' फ़ाइल के लिए लक्ष्य कैसे निर्धारित कर सकते हैं? यह एक वास्तविक फ़ाइल नहीं है जो परियोजना में बैठती है, बल्कि निर्माण पर Xcode द्वारा संकलित की जाती है।
जिमीजैमड

1
यहाँ मेरे "मैं भी 'MyProject-Swift.h' फ़ाइल को त्रुटि नहीं मिली .." के लिए एक अद्यतन है। ऊपर टिप्पणी: मैंने MyProjectTests के विरोध के रूप में MyProject के लिए MyProjectTests लक्ष्य के उत्पाद मॉड्यूल नाम को सेट करके वर्कअराउंड पाया। तो, अब दोनों लक्ष्य (MyProject और MyProjectTests) का एक ही उत्पाद मॉड्यूल नाम है। यह अजीब है, लेकिन यह काम करता है और कम जोखिम है क्योंकि यह टेस्ट लक्ष्य है। मुझे यह उल्लेख करना चाहिए कि मेरा प्रोजेक्ट नाम वास्तव में माय-प्रोजेक्ट की तरह है। My_Project वास्तविक मॉड्यूल नाम है।)
फाइनेंशेलहेल

6
"MyProject-Swift.h" फ़ाइल "$ (TARGET_TEMP_DIR) /..// (PROJECT_NAME) .build / DerivedSources" पर जनरेट की जाती है। मैं अपने यूनिट टेस्ट लक्ष्य के लिए हेडर सर्च पाथ्स में इसे जोड़ रहा हूं।
गजरवाल

1
@gagarwal मेरे यूनिट टेस्ट लक्ष्य के लिए हैदर सर्च पाथ्स में "$ (TARGET_TEMP_DIR) /../> (PROJECT_NAME) .build / DerivedSource" को जोड़कर काम किया। :) उस टिप्पणी में से एक एसओ उत्तर दें और मैं आपको पुरस्कृत कर सकता हूं और साथ ही यह दूसरों के लिए स्पष्ट कर सकता है कि यह एक महान उत्तर क्या है।
15-12 को 15

जवाबों:


148

"MyProject-Swift.h" फ़ाइल निम्न पथ पर बनाई गई है:

"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"

मैं अपने यूनिट टेस्ट लक्ष्य के लिए हेडर सर्च पाथ्स में इसे जोड़ रहा हूं।

जैसा कि @hyouuu ने ज्ञात मुद्दे के बारे में बताया, उम्मीद है कि Apple अपने अंत में कुछ अच्छा समाधान प्रदान करेगा। जब तक मेरा मानना ​​है कि हमें इस उपरोक्त समाधान का उपयोग करने की आवश्यकता है।

https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html


एक जादू की तरह काम किया!
डोनानेलिया

बहुत बढ़िया! पता नहीं क्यों Apple एक workaround के रूप में यह उल्लेख नहीं है। यह भी आश्चर्य की बात है कि इस मुद्दे पर अधिक लोग नहीं हैं। एक मौजूदा ओब्ज-सी परियोजना के साथ जो कोई भी चीज़ों को स्विफ्ट में परिवर्तित कर रहा है, वह धीरे-धीरे इस मुद्दे से टकराएगा।
mluisbrown

@fabb सच नहीं है - TARGET_NAME आमतौर पर <Product Name> Testsआपके परीक्षण लक्ष्य में कुछ ऐसा है । हालाँकि यह समाधान काम नहीं करता है यदि आपके उत्पाद का नाम रिक्त स्थान है। समाधान के लिए नीचे मेरा उत्तर देखें ।
क्रिस्टोफर पिक्सले

2
बस एक नोट, मुझे खोज पथ जोड़ना था, और इसे विशेष रूप से "पुनरावर्ती" के रूप में सेट करना था। स्पष्ट हो सकता है, लेकिन यह कुछ समय तक काम नहीं करता था जब तक कि मैंने ऐसा नहीं किया; मुझे लगता है कि यह तो सबफ़ोल्डर्स में चला जाता है।
मिरो

1
मेरी परियोजना के लिए, $(TARGET_TEMP_DIR)काम नहीं किया। मैं घाव का उपयोग कर रहा हूं$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
जॉर्डन बॉन्डो

32

यह पता लगाने के लिए @gagarwal को धन्यवाद। हमारे मामले में उत्पाद का नाम एक स्थान है, जो अंदर ढह गया है $PROJECT_NAME, इसलिए मुझे इसे कोड करना पड़ा। इसके अतिरिक्त, इसके $CONFIGURATION_TEMP_DIRबजाय का उपयोग करके $TARGET_TEMP_DIR, आप मूल निर्देशिका ( ../) को पथ से हटा सकते हैं । तो समाधान यह है कि अपने परीक्षण लक्ष्य में निम्न खोज पथों को जोड़ें:

"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"

या, यदि आपके उत्पाद में स्थान नहीं हैं:

"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"

साथ ही यूनिट-टेस्टिंग कोर डेटा कोडजेन वर्गों की समस्या का समाधान करता है।
एलिसे वान लूइज

14

Xcode 6.1 रिलीज नोट में देखा गया, कि यह एक ज्ञात समस्या है ... साइन ... "-swift.h" के लिए जारी नोट में खोजें https://developer.apple.com/library/content/documentation/Xcode /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

ऑब्जेक्टिव-सी में लिखे गए टेस्ट स्विफ्ट जनरेट किए गए इंटरफेस हेडर ($ (PRODUCT_MODULE_NAME) -Swift.h) को आयात नहीं कर सकते, और इसलिए इस हेडर की आवश्यकता वाले कोड का परीक्षण करने के लिए उपयोग नहीं किया जा सकता है।

स्विफ्ट कोड के लिए टेस्ट स्विफ्ट में लिखे जाने चाहिए। फ्रेमवर्क लक्ष्य के लिए ऑब्जेक्टिव-सी में लिखे गए टेस्ट्स @import फ्रेमवर्क नाम का उपयोग करके फ्रेमवर्क मॉड्यूल को आयात करके स्विफ्ट उत्पन्न इंटरफेस तक पहुंच सकते हैं; (16931027)

नीचे देखें @ gagarwal का वर्कअराउंड, जिसमें काम करता है!


8

मुझे आपके समान मुद्दा था, मुझे लगता है; यहाँ मेरा सेटअप था।

मेरे पास स्विफ्ट में परिभाषित एक वस्तु थी:

// file Foo.swift
@objc public class Foo {
    // ...
}

इस वर्ग का उपयोग तब Objective-C ऑब्जेक्ट के प्रारंभ में किया गया था:

// file Bar.h
#import "MyProject-Swift.h"

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

यह मेरी इकाई परीक्षणों को Barसंकलित करने के लिए नहीं बना है , क्योंकि MyProject-Swift.hहेडर वास्तविक नहीं है और इकाई परीक्षण लक्ष्य इसे नहीं देख सकता है। @Hyouuu द्वारा साझा किया गया रिलीज़ नोट बिंदु पर है - लेकिन मैं स्विफ्ट क्लास का परीक्षण नहीं कर रहा हूँ, मैं ऑब्जेक्टिव-सी क्लास का परीक्षण कर रहा हूँ!

मैं Barइसके बजाय एक आगे वर्ग संदर्भ का उपयोग करने के लिए हेडर फ़ाइल को बदलकर इसे ठीक करने में सक्षम था :

// file Bar.h
@class Foo;

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

मैं फिर अंदर शामिल MyProject-Swift.hहुआBar.m और सब कुछ काम किया - ऑब्जेक्टिव-सी में लिखी गई ऑब्जेक्टिव-सी वस्तुओं के मेरे परीक्षण ठीक से संकलित किए गए और लगातार चलते रहे, और मैं स्विफ्ट में स्विफ्ट ऑब्जेक्ट्स के लिए नए परीक्षण लिख सकता था।

उम्मीद है की यह मदद करेगा!


आपका समाधान Fooअंदर एपीआई का उपयोग करने की अनुमति नहीं देता है Bar.m
येविन दुबीनिन

2
सुनिश्चित करें कि यह करता है - क्या यह शामिल है कि के MyProject-Swift.hमें .mफ़ाइल आप हो जाता है।
dpassage

4

इस विषय पर मुझे जो कुछ भी मिल सकता है, मैंने कोशिश करने के बाद, मेरे लिए काम करने वाली चीज़ वास्तव में ऐप चला रहा था , हालांकि यह अभी भी 'ModuleName-Swift.h फ़ाइल नहीं मिली' त्रुटि दिखा रहा था।

यह चला गया और मेरा ऐप पूरी तरह से ठीक काम करता है। मुझे लगता है कि मुझे पहले से विचार करना चाहिए था ... त्रुटि वापस आती रहती है , लेकिन ऐप चलाने के बाद यह हमेशा बस फिर से चली जाती है। इसलिए यह मुद्दा वास्तव में मेरे लिए हल नहीं है, लेकिन मैं अभी अन्य विषयों पर काम करना जारी रख सकता हूं ...


हाँ यह एक समाधान है कि "नहीं मिला" त्रुटि दूर हो।
विजय कुमार कांता

अभी भी, एप्लिकेशन के काम करते समय बिल्ड विफल रहता है। इसे ठीक करें, Apple!
स्कॉट्टीब


0

अजीब तरह से, मैं यह एक ही त्रुटि देख रहा था, लेकिन केवल एक उपकरण को लक्षित करते समय (सिम्युलेटर नहीं)। परीक्षण चलाने से पहले मैं "MyProjectNameTests-Swift.h" के आयात विवरण के आगे लाल विस्मयादिबोधक बिंदु देखूंगा।

हालांकि, मजेदार बात यह है, अगर मैं अभी आगे बढ़ता हूं और वैसे भी परीक्षण चलाता हूं (इस स्पष्ट निर्माण त्रुटि के बावजूद), तो उसके बाद होने वाले निर्माण चरण के दौरान, XCode वास्तव में "MyProjectNameTests-Swift.h" फाइल, और परीक्षण उत्पन्न करता है। ठीक चलता है!

इसलिए, कम से कम मेरे मामले में, यहाँ अन्य समाधानों की कोई आवश्यकता नहीं थी, जाहिर है, हालांकि मेरा मानना ​​है कि वे भी काम करते हैं।

मुझे यह भी ध्यान देना चाहिए कि मैंने इससे पहले अपनी DerivedData निर्देशिका को हटा दिया है, इसलिए शायद यह एक कदम भी है जो कोशिश करने लायक है।


-1

mySwiftClassTests(और कोई अन्य स्विफ्ट क्लासेस जो आप वस्तुनिष्ठ-सी में उपयोग करना चाहते हैं) को चिह्नित करने की आवश्यकता है @objc:

@objc class MySwiftClassTests: XCTestCase

-1

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.