iOS - Swift için Birim Testleri çalıştırılırken 'MyProject-Swift.h' dosyası bulunamadı


95

Projem için Birim Testi kurmaya çalışıyorum. Yakın zamanda bir Swift sınıfı eklediğim mevcut bir Objective-C uygulaması. 'MyProject-Swift.h' ve Swift Bridging dosyalarını (hem 'MyProject' hem de 'MyProjectTest') kurdum ve hem Objective-C hem de Swift kodunu kullanarak uygulamayı çok iyi bir şekilde oluşturabilir ve çalıştırabilirim.

Ancak, şimdi yeni Swift sınıfında bazı Birim Testleri çalıştırmak istiyorum. Test dosyamı kurdum ve aşağıdaki gibi görünüyor:

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.
        }
    }

}

Uygulamayı Test olarak çalıştırırken bu hatayı alıyorum:

'MyProject-Swift.h' file not found

Bunun neden sadece Testleri çalıştırmaya çalışırken gerçekleştiğinden emin değilim. Herhangi bir öneri?


1
Bununla ilgili güncellemeler eklensin mi? Ben de aynı sorunla karşılaşıyorum ...
hyouuu

1
@Coveloper - '-Swift.h' dosyası için hedefleri nasıl belirleyeceksiniz? Projede yer alan gerçek bir dosya değil, bunun yerine Xcode tarafından derlenmiş.
JimmyJammed

1
İşte yukarıdaki "MyProject-Swift.h 'dosyası bulunamadı hatası alıyorum .." yorumum için bir güncelleme: MyProjectTests hedefinin Ürün Modülü Adını MyProjectTests yerine MyProject olarak ayarlayarak bir geçici çözüm buldum. Dolayısıyla, artık her iki hedef de (MyProject ve MyProjectTests) aynı Ürün Modülü Adına sahiptir. Bu tuhaf ama işe yarıyor ve Test hedefi olduğu için düşük riskli. Proje ismimin aslında My-Project'e benzediğini ve dolayısıyla My_Project'in gerçek modül adı olduğunu
belirtmeliyim

6
"MyProject-Swift.h" dosyası "$ (TARGET_TEMP_DIR) /../$ (PROJECT_NAME) .build / DerivedSources" adresinde oluşturulur. Bunu, Birim Testi hedefim için Başlık Arama Yollarına ekledim.
gagarwal

1
@gagarwal Birim Testi hedefim için Başlık Arama Yollarına "$ (TARGET_TEMP_DIR) /../$ (PROJECT_NAME) .build / DerivedSources" eklenmesi işe yaradı. :) Bu yorumdan bir SO cevabı verin ve ben size ödülü verebilir ve bunun ne kadar harika bir cevap olduğunu başkaları için netleştirebilirim.
finneycanhelp

Yanıtlar:


148

"MyProject-Swift.h" dosyası aşağıdaki yolda oluşturulur:

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

Bunu, Birim Testi hedefim için Başlık Arama Yollarına ekledim.

Ayrıca @hyouuu'nun bilinen sorun olduğuna işaret ettiği gibi, umarım Apple sonunda iyi bir çözüm sunacaktır. Yukarıdaki çözümü kullanmamız gerektiğine inanıncaya kadar.

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


Büyü gibi çalıştı!
DonnaLea

Harika! Apple'ın neden bir çözüm olarak bundan bahsetmediğini bilmiyorum. Ayrıca bu sorunu yaşayan daha fazla insan olmamasına şaşırdım. İşleri kademeli olarak Swift'e dönüştüren mevcut bir Obj-C projesi olan herkes bu sorunu çözecektir.
mluisbrown

@fabb doğru değil - TARGET_NAME genellikle <Product Name> Teststest hedefinizdeki gibidir. Ancak ürün adınızda boşluklar varsa bu çözüm işe yaramaz. Bkz aşağıda Cevabımı çözüm için.
Christopher Pickslay

2
Sadece bir not, Arama Yolunu eklemem ve onu özellikle "özyinelemeli" olarak ayarlamam gerekiyordu. Açık olabilir, ama bunu yapana kadar birkaç kez işe yaramadı; Alt klasörlere girdiğini varsayıyorum.
Miro

1
Benim proje için $(TARGET_TEMP_DIR)çalışmadı. Kullanarak yaralandım$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Jordan Bondo

33

Bunu çözdüğün için @ gagarwal'a teşekkürler. Bizim durumumuzda, ürün adında daraltılmış bir boşluk var, bu $PROJECT_NAMEyüzden onu zor kodlamak zorunda kaldım. Ek olarak, $CONFIGURATION_TEMP_DIRyerine kullanarak $TARGET_TEMP_DIRana dizini ( ../) yoldan kaldırabilirsiniz . Dolayısıyla çözüm, test hedefinizdeki Başlık Arama Yollarına aşağıdakileri eklemektir:

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

Veya ürününüz boşluk içermiyorsa:

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

Ayrıca, Core Data codegen sınıflarının birim testi sorununu çözer.
Elise van Looij

14

Xcode 6.1 sürüm notunda bunun bilinen bir sorun olduğunu gördüm ... işaret ... https://developer.apple.com/library/content/documentation/Xcode sürüm notunda "-swift.h" araması yapın /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

Objective-C'de yazılan testler, uygulama hedefleri için Swift tarafından oluşturulan arayüz başlığını ($ (PRODUCT_MODULE_NAME) -Swift.h) içe aktaramaz ve bu nedenle bu başlığı gerektiren kodu test etmek için kullanılamaz.

Swift kodu testleri Swift ile yazılmalıdır. Çerçeve hedefleri için Objective-C'de yazılan testler, Swift tarafından oluşturulan arayüzlere çerçeve modülünü @import FrameworkName; (16931027)

Lütfen aşağıdaki ÇALIŞAN @ gagarwal çözümüne bakın!


8

Bende de benzer bir sorun vardı sanırım; benim kurulumum buydu.

Swift'de tanımlanmış bir nesnem vardı:

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

Bu sınıf daha sonra Objective-C nesnesinin başlatıcısında kullanıldı:

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

@interface Bar: NSObject

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

@end

Başlık gerçek olmadığından ve birim test hedefi göremediğinden Bar, bu benim birim testlerimi derlememe MyProject-Swift.hiçin yaptı. @Hyouuu tarafından paylaşılan sürüm notu yerinde - ancak bir Swift sınıfını test etmiyorum, bir Objective-C sınıfını test ediyorum!

Bunun Baryerine ileri bir sınıf başvurusu kullanmak için başlık dosyasını değiştirerek bunu düzeltebildim :

// file Bar.h
@class Foo;

@interface Bar: NSObject

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

@end

Sonra dahil MyProject-Swift.hiçinde Bar.mve her şey amele - Objective-C benim testler düzgün derlenmiş Objective-C ile yazılmış ve koşu devam etti ve Swift Swift nesneleri için yeni testler yazabilirsiniz nesnelerin.

Bu yardımcı olur umarım!


Çözümünüz, Foo'ın API'sinin içinde kullanılmasına izin vermiyor Bar.m.
Yevhen Dubinin

2
Elbette öyle - dahil ne anlama en MyProject-Swift.hiçinde .mdosya alır.
2014

4

Konuyla ilgili bulabildiğim her şeyi denedikten sonra, benim için işe yarayan şey aslında uygulamayı çalıştırıyordu, ancak yine de 'ModuleName-Swift.h dosyası bulunamadı' hatasını gösteriyordu.

Uzaklaştı ve uygulamam mükemmel çalışıyor. Sanırım bunu daha önce düşünmeliydim ... Hata geri gelmeye devam ediyor , ancak uygulamayı çalıştırdıktan sonra her zaman tekrar kayboluyor. Yani sorun benim için pek çözülmedi ama şimdilik başka konular üzerinde çalışmaya devam edebilirim ...


Evet, bu "bulunamadı" hatasını ortadan kaldırmak için bir çözüm.
Vijay Kumar Kanta

Şimdi bile, yalnızca uygulamayı çalıştırırken Build başarısız oluyor. Bunu düzelt Apple!
ScottyB


0

Garip bir şekilde, aynı hatayı görüyordum, ancak yalnızca bir cihazı hedeflerken (simülatörü değil). Testi çalıştırmadan önce, "MyProjectNameTests-Swift.h" için import ifadesinin yanında kırmızı ünlem işaretini görürdüm.

Bununla birlikte, komik olan şey şu ki, devam edip testi yine de çalıştırırsam (bu belirgin yapı hatasına rağmen), daha sonra meydana gelen oluşturma aşamasında, XCode aslında "MyProjectNameTests-Swift.h" dosyasını ve testi oluşturuyor gayet iyi çalışıyor!

Yani, en azından benim durumumda, buradaki diğer çözümlere ihtiyaç yoktu, açıkçası, onların da işe yaradığını düşünmeme rağmen.

Ayrıca bundan önce DerivedData dizinimi sildiğimi de not etmeliyim, bu yüzden belki bu da denemeye değer bir adımdır.


-1

mySwiftClassTests(ve hedef-c'de kullanmak istediğiniz diğer tüm hızlı sınıflar) işaretlenmelidir @objc:

@objc class MySwiftClassTests: XCTestCase

-1

Diğer cevaplarda bahsedilen dosya yolunu ekleyerek onu çalıştıramadım, ancak şikayet ettiği dosyanın test edilmediğini fark ettim. Sağ Yardımcı Programlar Yan Çubuğunu kullanarak test hedefinden kaldırmam gerekti.


-2

Bu hedefe bir .swift dosyası eklemek, üzerindeki sorunu düzeltir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.