আইওএস - সুইফটের জন্য ইউনিট টেস্ট চালানোর সময় 'মাইপ্রজেক্ট-সুইফট।' ফাইলটি পাওয়া যায় নি


95

আমি আমার প্রকল্পের জন্য ইউনিট পরীক্ষা করার চেষ্টা করছি। এটি একটি বিদ্যমান অবজেক্টিভ-সি অ্যাপ্লিকেশন, যা আমি সম্প্রতি একটি সুইফ্ট শ্রেণিতে যুক্ত করেছি। আমি 'মাইপ্রজেক্ট-সুইফট। एच' এবং সুইফট ব্রিজিং ফাইল (উভয় 'মাইপ্রজেক্ট' এবং 'মাইপ্রজেক্টেস্ট') সেটআপ করেছি এবং আমি উদ্দেশ্য-সি এবং সুইফট কোড উভয়ই অ্যাপ্লিকেশনটি তৈরি করতে এবং ঠিক চালাতে সক্ষম হয়েছি।

তবে, এখন আমি নতুন সুইফ্ট শ্রেণিতে কিছু ইউনিট টেস্ট চালাতে চাই। আমি আমার পরীক্ষার ফাইলটি সেটআপ করি এবং এটি নীচের মত দেখাচ্ছে:

মাইউইউফটক্লাসটিস্টস.ইউফিট:

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

আমি নিশ্চিত নই যে কেন টেস্টগুলি চালানোর চেষ্টা করার সময়ই এটি ঘটে। কোনও পরামর্শ?


4
এর উপর আপডেট যুক্ত করবেন? আমি একই সমস্যার মুখোমুখি ...
হিউউউ

4
@ কোভেলোপার - আপনি কীভাবে '-সুইফট এইচ' ফাইলের জন্য লক্ষ্য নির্ধারণ করতে পারবেন? এটি কোনও আসল ফাইল নয় যা এই প্রকল্পে বসে, তবে পরিবর্তে Xcode দ্বারা বিল্ডে সংকলিত।
জিমি জামেমেড

4
এখানে আমার "আমি 'মাইপ্রজেক্ট-সুইফট।' ফাইলটি ত্রুটি খুঁজে পেল না তার একটি আপডেট এখানে দেওয়া হয়েছে .." উপরের মন্তব্য: মাইপ্রজেক্ট টেস্টের বিপরীতে মাইপ্রজেক্ট টেস্টস টার্গেটের প্রোডাক্ট মডিউলটির নাম মাইপ্রজকে সেট করে আমি একটি কাজ পেয়েছি। সুতরাং, এখন উভয় লক্ষ্য (মাইপ্রজেক্ট এবং মাইপ্রজেক্ট টেস্টস) এর একই পণ্য মডিউল নাম। এটি অদ্ভুত, তবে এটি কার্যকর এবং টেস্ট লক্ষ্য হওয়ায় এটি কম ঝুঁকিপূর্ণ। আমার উল্লেখ করা উচিত যে আমার প্রকল্পের নামটি আসলে আমার-প্রকল্পের মতো, সুতরাং মাইপ্রজেক্টটি আসল মডিউলটির নাম))
ফিনেচেনহেલ્પ

6
"মাইপ্রজেক্ট-সুইফট।" ফাইলটি "$ (TARGET_TEMP_DIR) /../$ (PROJECT_NAME)। বিল্ড / উত্পন্ন উত্স" এ উত্পন্ন হয়। আমি আমার ইউনিট পরীক্ষার টার্গেটের জন্য শিরোনাম অনুসন্ধানের পথগুলিতে এটি যোগ করব।
গাগরওয়াল

4
@gagarwal "" (TARGET_TEMP_DIR) /../.. (PROJECT_NAME) যোগ করুন। :) এই মন্তব্যটির বাইরে একটি উত্তর দিন এবং আমি আপনাকে অনুগ্রহ প্রদান করতে পারি এটি অন্যদের জন্য এটির দুর্দান্ত উত্তর কী তা তা পরিষ্কার করে দিতে পারি।
ফিনিয়েনহেল্প

উত্তর:


148

"মাইপ্রজেক্ট-সুইফট।" ফাইলটি নিম্নলিখিত পথে তৈরি করা হয়েছে:

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

আমি আমার ইউনিট পরীক্ষার টার্গেটের জন্য শিরোনাম অনুসন্ধানের পথে এটি যুক্ত করব up

এছাড়াও @ হাইউউ হিসাবে পরিচিত সমস্যা হিসাবে উল্লেখ করেছেন, আশা করি অ্যাপল তাদের শেষের দিকে কিছু ভাল সমাধান সরবরাহ করবে। যতক্ষণ না আমি বিশ্বাস করি আমাদের উপরের সমাধানটি ব্যবহার করা দরকার।

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


মোহন মত কাজ!
ডোনালিয়া

অসাধারণ! কেন অ্যাপল এটিকে কার্যবিধির হিসাবে উল্লেখ করে না জানুন। এছাড়াও বিস্মিত হয়েছে যে এই সমস্যাটি নিয়ে বেশি লোক নেই। বিদ্যমান ওবিজে-সি প্রকল্পের সাথে যে কেউ ধীরে ধীরে জিনিসগুলিকে সুইফটে রূপান্তরিত করে এই সমস্যাটিতে আসবে।
mluisbrown

@ ফ্যাব সত্য নয় - TARGET_NAME সাধারণত <Product Name> Testsআপনার পরীক্ষার টার্গেটের মতো। তবে আপনার পণ্যের নামের শূন্যস্থান থাকলে এই সমাধানটি কার্যকর হয় না। সমাধানের জন্য নীচে আমার উত্তর দেখুন ।
ক্রিস্টোফার পিক্সলে 23 '

4
কেবল একটি নোট, আমাকে অনুসন্ধানের পথটি যুক্ত করতে হয়েছিল এবং এটি বিশেষত "পুনরাবৃত্ত" হিসাবে সেট করতে হয়েছিল। সুস্পষ্ট হতে পারে, তবে আমি এটি না করা পর্যন্ত এটি কয়েকবার কার্যকর হয়নি; আমি ধরে নিলাম এটি তখন সাবফোল্ডারে যায় into
মিরো

4
আমার প্রকল্পের জন্য, $(TARGET_TEMP_DIR)কাজ হয়নি। আমি ক্ষতবিক্ষত করে দিয়েছিলাম$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
জর্ডান বোন্ডো

33

এটি জানার জন্য @ গাগরওয়ালকে ধন্যবাদ। আমাদের ক্ষেত্রে পণ্যটির নামের একটি স্থান রয়েছে যা ভেঙে পড়েছে $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

এক্সকোড 6.1 রিলিজ নোটে দেখেছি, এটি একটি পরিচিত সমস্যা ... সাইন ... রিলিজ নোটে "-swift.h" অনুসন্ধান করুন https://developer.apple.com/library/content/docamentation/Xcode / কনসেপ্টুয়াল / আরএন- এক্সকোড- আর্কাইভ / চ্যাটারস / এক্সসি __আগ্রহ করে_নোট

অবজেক্টিভ-সি-তে লিখিত পরীক্ষাগুলি অ্যাপ্লিকেশন লক্ষ্যগুলির জন্য সুইফট উত্পন্ন ইন্টারফেস শিরোলেখ (PRODU (PRODUCT_MODULE_NAME) -Swift.h) আমদানি করতে পারে না এবং তাই এই শিরোনামের প্রয়োজন হয় এমন কোডের পরীক্ষার জন্য ব্যবহার করা যাবে না।

সুইফট কোডের জন্য টেস্টগুলিকে সুইফটে লেখা উচিত। ফ্রেমওয়ার্ক টার্গেটের জন্য অবজেক্টিভ সি-তে লিখিত পরীক্ষাগুলি ফ্রেমওয়ার্ক মডিউলটি @ ইম্পোর্ট ফ্রেমওয়ার্ক নাম ব্যবহার করে আমদানি করে সুইফট উত্পন্ন ইন্টারফেসগুলি অ্যাক্সেস করতে পারে। (16931027)

দয়া করে @ গাগরওয়ালের কর্মক্ষেত্রটি দেখুন যা নীচে কাজ করে!


8

আমার আপনার মত একই সমস্যা ছিল, আমি মনে করি; এখানে আমার সেটআপ ছিল।

আমি সুইফটে সংজ্ঞায়িত একটি বিষয় ছিল:

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

এই ক্লাসটি তখন একটি উদ্দেশ্য-সি অবজেক্টের প্রারম্ভকালে ব্যবহৃত হত:

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

@interface Bar: NSObject

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

@end

এটি আমার ইউনিট পরীক্ষাগুলি Barসংকলন না করার জন্য তৈরি করেছিল , যেহেতু MyProject-Swift.hশিরোনামটি আসল নয় এবং ইউনিট পরীক্ষার লক্ষ্য এটি দেখতে পাচ্ছে না। @ হাইউউ শেয়ার করা প্রকাশের নোটটি পয়েন্টে রয়েছে - তবে আমি একটি সুইফ্ট ক্লাস পরীক্ষা করছি না, আমি একটি উদ্দেশ্য-সি ক্লাস পরীক্ষা করছি!

Barপরিবর্তে একটি ফরোয়ার্ড শ্রেণীর রেফারেন্স ব্যবহারের জন্য আমি শিরোনাম ফাইলটি পরিবর্তন করে এটি ঠিক করতে সক্ষম হয়েছি :

// file Bar.h
@class Foo;

@interface Bar: NSObject

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

@end

আমি তখন অন্তর্ভুক্ত MyProject-Swift.hমধ্যে Bar.m, এবং সবকিছু কাজ - উদ্দেশ্য সি আমার পরীক্ষার উদ্দেশ্য সি সঠিকভাবে কম্পাইল লেখা এবং চলমান অব্যাহত বস্তু, এবং আমি নতুন পরীক্ষা লিখতে পারে সুইফট সুইফট বস্তু জন্য।

আশাকরি এটা সাহায্য করবে!


আপনার সমাধানটি Fooভিতরে API এর API ব্যবহার করার অনুমতি দেয় না Bar.m
ইয়েভেন ডাবিনিন

4
নিশ্চিতভাবেই এটি ঘটে - ফাইলের অন্তর্ভুক্ত MyProject-Swift.hএটি .mআপনাকে দেয়।
dpassage

4

আমি এই বিষয়টিতে যা খুজে পেয়েছি তার সবগুলি চেষ্টা করার পরে, আমার পক্ষে যে জিনিসটি কাজ করেছিল সেটি আসলে অ্যাপ্লিকেশনটি চালাচ্ছিল যদিও এটি এখনও 'মডিউলনেম-সুইফট। ফাইল খুঁজে পাওয়া যায়নি' ত্রুটিটি দেখায়।

এটি চলে গেল এবং আমার অ্যাপ্লিকেশন পুরোপুরি সূক্ষ্মভাবে কাজ করে। আমার ধারণা আমি এর আগে বিবেচনা করা উচিত ছিল ... ত্রুটিটি ফিরে আসতে থাকে তবে অ্যাপটি চালানোর পরে এটি সর্বদা আবার চলে যায়। সুতরাং সমস্যাটি আমার পক্ষে সত্যিই সমাধান করা হয়নি, তবে আমি আপাতত অন্যান্য বিষয়ে কাজ চালিয়ে যেতে পারি ...


হ্যাঁ এটি "সমাধান খুঁজে পাওয়া যায়নি" ত্রুটিটি চলে যাওয়ার সমাধান।
বিজয় কুমার কান্ত

এমনকি এখন, অ্যাপ্লিকেশনটি চালানোর সময় বিল্ড ব্যর্থ হয়। এটি ঠিক করুন, অ্যাপল!
স্কটিবি


0

আশ্চর্যের বিষয় হল, আমি এই একই ত্রুটিটি দেখছিলাম, তবে কেবল কোনও ডিভাইসকে লক্ষ্য করে (সিমুলেটরটি নয়)। পরীক্ষা চালানোর আগে আমি "মাইপ্রজেক্টনেমেটসেটস-সুইফট। H" "র জন্য আমদানি বিবৃতিটির পাশে লাল বিস্ময়বোধক পয়েন্টটি দেখতে পেতাম।

তবে মজার বিষয়টি হ'ল, যদি আমি কেবল এগিয়ে যাই এবং যাইহোক পরীক্ষা চালিয়ে যাই (এই আপাতদৃষ্টিতে বিল্ড ত্রুটি থাকা সত্ত্বেও) এরপরে ঘটে যাওয়া বিল্ড পর্বের সময়, এক্সকোড আসলে "মাইপ্রজেক্টনেমটেষ্টস-সুইফট।" ফাইল এবং পরীক্ষা তৈরি করে ঠিক ঠিক রান!

সুতরাং, কমপক্ষে আমার ক্ষেত্রে এখানে অন্যান্য সমাধানের দরকার ছিল না, স্পষ্টতই, যদিও আমি বিশ্বাস করি তারাও কাজ করে।

আমার এটিও লক্ষ্য করা উচিত যে আমি এর আগে আমার ডেরিভডডাটা ডিরেক্টরিটি মুছে ফেলেছি, তাই এটি চেষ্টা করার মতো একটি পদক্ষেপও।


-1

mySwiftClassTests(এবং অবজেক্ট-সিতে আপনি যে কোনও সুইফ্ট ক্লাস ব্যবহার করতে চান) চিহ্নিত করা দরকার @objc:

@objc class MySwiftClassTests: XCTestCase

-1

অন্যান্য উত্তর দ্বারা উল্লিখিত ফাইলপথটি যুক্ত করে আমি এটি কাজ করতে পারিনি, তবে আমি বুঝতে পেরেছি যে ফাইলটি যেখানে অভিযোগ করছিল তা পরীক্ষা করাও হচ্ছে না। ডান ইউটিলিটিস সাইড বার ব্যবহার করে আমাকে পরীক্ষার লক্ষ্য থেকে সরিয়ে ফেলতে হয়েছিল।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.