Estou tentando configurar o Teste de Unidade para meu projeto. É um aplicativo Objective-C existente, ao qual adicionei recentemente uma classe Swift. Eu configurei os arquivos 'MyProject-Swift.h' e Swift Bridging (ambos 'MyProject' e 'MyProjectTest') e sou capaz de construir e executar o aplicativo perfeitamente usando os códigos Objective-C e Swift.
No entanto, agora quero executar alguns testes de unidade na nova classe Swift. Eu configurei meu arquivo de teste e ele se parece com o seguinte:
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.
}
}
}
Recebo este erro ao executar o aplicativo como Teste:
'MyProject-Swift.h' file not found
Não sei por que isso acontece apenas ao tentar executar os testes. Alguma sugestão?
ios
unit-testing
swift
header
JimmyJammed
fonte
fonte
Respostas:
O arquivo "MyProject-Swift.h" é gerado no seguinte caminho:
"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"
Eu acabo adicionando isso aos Caminhos de pesquisa de cabeçalho para o meu alvo de teste de unidade.
Além disso, como @hyouuu apontou ser o problema conhecido, espero que a Apple forneça uma boa solução para eles. Até eu acreditar que precisamos usar a solução acima.
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
fonte
<Product Name> Tests
com o seu alvo de teste. No entanto, esta solução não funciona se o nome do seu produto tiver espaços. Veja minha resposta abaixo para uma solução.$(TARGET_TEMP_DIR)
não funcionou. Acabei usando$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Obrigado a @gagarwal por descobrir isso. Em nosso caso, o nome do produto tem um espaço, que está reduzido
$PROJECT_NAME
, então tive que codificá-lo. Além disso, usando em$CONFIGURATION_TEMP_DIR
vez de$TARGET_TEMP_DIR
, você pode remover o diretório pai (../
) do caminho. Portanto, a solução é adicionar o seguinte aos Caminhos de pesquisa de cabeçalho em seu destino de teste:Ou, se o seu produto não contiver espaços:
fonte
Vimos na nota de versão do Xcode 6.1 que este é um problema conhecido ... sinal ... Pesquise "-swift.h" na nota de versão https://developer.apple.com/library/content/documentation/Xcode /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
Consulte a solução alternativa de @gagarwal abaixo que FUNCIONA!
fonte
Eu tive um problema semelhante ao seu, eu acho; aqui estava minha configuração.
Eu tinha um objeto definido no Swift:
Essa classe foi então usada no inicializador de um objeto Objective-C:
Isso fez com que meus testes de unidade
Bar
não fossem compilados, já que oMyProject-Swift.h
cabeçalho não é real e o destino do teste de unidade não pode vê-lo. A nota de lançamento compartilhada por @hyouuu está certa - mas não estou testando uma classe Swift, estou testando uma classe Objective-C!Consegui consertar isso alterando o arquivo de cabeçalho para
Bar
usar uma referência de classe direta:Eu, então, incluído
MyProject-Swift.h
noBar.m
, e tudo funcionou - meus testes de Objective-C objetos escrito em Objective-C compilado corretamente e continuou correndo, e eu poderia escrever novos testes para Swift objetos em Swift.Espero que isto ajude!
fonte
Foo
da API de dentroBar.m
.MyProject-Swift.h
no.m
arquivo.Depois de experimentar tudo o que pude encontrar sobre o assunto, a única coisa que funcionou para mim foi, na verdade, executar o aplicativo, embora ainda exibisse o erro 'Nome do módulo-arquivo Swift.h não encontrado'.
Ele foi embora e meu aplicativo funciona perfeitamente bem. Acho que deveria ter pensado nisso antes ... O erro continua voltando , mas depois de executar o aplicativo, ele sempre desaparece novamente. Então, o problema não está realmente resolvido para mim, mas posso continuar trabalhando em outros tópicos por enquanto ...
fonte
Um simples
fez o trabalho para mim.
fonte
Estranhamente, eu estava vendo o mesmo erro, mas apenas ao direcionar um dispositivo (não o simulador). Antes de executar o teste, eu veria o ponto de exclamação vermelho próximo à instrução de importação para "MyProjectNameTests-Swift.h".
No entanto, o engraçado é que, se eu apenas prosseguir e executar o teste de qualquer maneira (apesar desse aparente erro de compilação), durante a fase de compilação que acontece depois disso, o XCode realmente gerará o arquivo "MyProjectNameTests-Swift.h" e o teste funciona muito bem!
Então, pelo menos no meu caso, não houve necessidade das outras soluções aqui, evidentemente, embora eu acredite que funcionem também.
Devo também observar que excluí meu diretório DerivedData antes disso, então talvez essa seja uma etapa que valha a pena tentar.
fonte
mySwiftClassTests
(e qualquer outra classe rápida que você deseja usar no objetivo-c) precisa ser marcada@objc
:fonte
Não consegui fazer funcionar adicionando aquele caminho de arquivo mencionado por outras respostas, mas percebi que o arquivo em que ele estava reclamando nem estava sendo testado. Eu apenas tive que removê-lo do alvo de teste usando a barra lateral direita de utilitários.
fonte
Adicionar um arquivo .swift a esse destino corrige o problema nele.
fonte