2015-08-28 177 views
17

我最近已將我的應用程序和單元測試轉換爲Swift 2.0。我在我的Tests.swift文件中使用了@testable import AppName單元測試Swift 2.0,@testable導入和方案定位問題

由於與不能夠在多個目標(see here for the issue)來執行子類的問題,我EntityName類只能是目標會員AppName,而不是AppNameTests

的問題是,一旦我切換到AppNameTests架構的模塊中運行單元測試,代碼AppName找不到類EntityName,我得到

使用未聲明的類型「實體名稱」

如果在AppNameTests方案中運行測試而沒有實體類不是該方案的成員時,如何編譯AppName

回答

17

由於與不能夠在多個目標

當編譯相同斯威夫特代碼的不同目標部分執行子類的問題時,編譯器實際上產生不同類別。所以它的行爲如同設計,但在運行應用程序的單元測試時幾乎肯定不是你想要的。

有兩種方法,我建議您設置模式,讓測試:

1.公共模式(推薦)

在你的應用目標:

import RealmSwift 
public class MyModel: Object {} 

此代碼應該只有被編譯爲應用程序目標的一部分,並且您的單元測試可以按以下方式設置:

import MyApp 
// should be able to access `MyModel` 

夠簡單嗎?

2. @Testable(SWIFT 2只)

這種方法依賴於@testable關鍵字夫特2.

引入。在你的應用程序的目標:

import RealmSwift 
internal class MyModel: Object {} // ACL cannot be `private` 

再次,此代碼應只有被編譯爲您的應用程序目標的一部分,並且您的單元測試可以按以下方式設置:

@testable import MyApp 
// should be able to access `MyModel` 

確保MyApp的內部版本設置Enable Testability設置爲YES

如果您正在構建一個框架,而該框架的用戶無法訪問某些內部模型,則此方法可能優於公共模型。

領域都有自己的文檔,詳細說明這些常見的方法來測試,你可以在這裏閱讀專用部分:https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets

+0

正確的,我*可*使用@testable,但文件的訪問我的模型從內MyApp的可以在編譯MyAppTests如果不是從我的測試訪問爲MyModel!非常令人沮喪 – styler1972

+0

聽起來像你的項目配置有問題。如果我不得不猜測,我會說模型文件正在與單元測試目標進行編譯,但不是應用程序目標。如果您將項目發送到[email protected],我很樂意查看它。 – jpsim

+0

嘿,事實證明,我不得不停止針對我的整個MyApp模塊的測試..堅果,它不工作! – styler1972

8

我不得不停止針對我的整個應用.swift文件是有MyAppTests的成員,並且單靠在@testable import MyApp

+0

這正是它應該如何工作。只編譯一次! – jpsim

+2

注意'MyApp'必須是項目中的* product module name *(設置 - >目標 - >生成設置 - >產品模塊名稱) –

0

我也有這個錯誤最近並沒有任何上述步驟解決了問題,什麼也解決它被移除從編譯來源非SWIFT文件建立階段的目標要運行的測試。這是失敗默默

enter image description here

0

首先確保@testable import MyApp被包含在每個測試文件。然後,在您的測試目標構建階段中,刪除所有非測試文件的複製包資源部分。測試目標中指向不在測試目標中的應用程序文件的應用程序文件正在破壞您的單元測試。刪除測試目標中的所有應用程序文件並添加@testable標誌,並且所有內容都應該可以正常工作!

0

我有類似的問題,問題是所有的應用程序源文件都鏈接到單元測試目標,所以編譯了兩次!

另外,我通過迦太基安裝了Realm,並且必須包括框架「Realm.framework」和「RealmSwift.framework」的兩個目標(主要和測試),因爲否則它將無法工作。

這裏是問題的鏈接

https://github.com/realm/realm-cocoa/issues/3627