Algum código em que estou testando a unidade precisa carregar um arquivo de recurso. Ele contém a seguinte linha:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
No aplicativo, ele roda muito bem, mas quando executado pela estrutura de teste da unidade pathForResource:
retorna nulo, o que significa que não foi possível localizar foo.txt
.
Verifiquei se isso foo.txt
está incluído na fase de criação Copy Bundle Resources do destino do teste de unidade. Por que não consigo encontrar o arquivo?
self
se refira a uma classe no pacote principal, não na classe de caso de teste. Substitua[self class]
por qualquer classe no seu pacote principal. Vou editar meu exemplo.bundleForClass:
com uma classe no pacote de teste de unidade. Você deve obter o caminho do arquivo no seu código de teste de unidade e depois passar a string do caminho para o seu outro código.Uma implementação rápida:
Swift 2
Swift 3, Swift 4
O pacote fornece maneiras de descobrir os caminhos principais e de teste para sua configuração:
No Xcode 6 | 7 | 8 | 9, um caminho de pacote de teste de unidade estará em
Developer/Xcode/DerivedData
algo como ...... que é separado do
Developer/CoreSimulator/Devices
caminho regular do pacote configurável (sem teste de unidade) :Observe também que o executável do teste de unidade está, por padrão, vinculado ao código do aplicativo. No entanto, o código do teste de unidade deve ter apenas a associação de destino apenas no pacote de teste. O código do aplicativo deve ter apenas a associação de destino no pacote de aplicativos. No tempo de execução, o pacote de destino do teste de unidade é injetado no pacote de aplicativos para execução .
Gerenciador de Pacotes Swift (SPM) 4:
Nota: Por padrão, a linha de comandos
swift test
criará umMyProjectPackageTests.xctest
pacote configurável de teste. E, oswift package generate-xcodeproj
criará umMyProjectTests.xctest
pacote de teste. Esses diferentes pacotes de teste têm caminhos diferentes . Além disso, os diferentes pacotes configuráveis de teste podem ter alguma estrutura interna de diretórios e diferenças de conteúdo .Nos dois casos, o
.bundlePath
e.bundleURL
retornará o caminho do pacote de teste atualmente em execução no macOS. No entanto,Bundle
atualmente não está implementado para o Ubuntu Linux.Além disso, a linha de comando
swift build
eswift test
atualmente não fornece um mecanismo para copiar recursos.No entanto, com algum esforço, é possível configurar processos para usar o Swift Package Manger com recursos nos ambientes macOS Xcode, linha de comando do macOS e linha de comando do Ubuntu. Um exemplo pode ser encontrado aqui: 004.4'2 SW Dev Swift Package Manager (SPM) com recursos Qref
Consulte também: Use recursos em testes de unidade com o Swift Package Manager
Swift Package Manager (SPM) 4.2
O Swift Package Manager PackageDescription 4.2 apresenta suporte para dependências locais .
Nota: Espero, mas ainda não testei, que algo como o seguinte seja possível com o SPM 4.2:
fonte
Com o Swift Swift 3, a sintaxe
self.dynamicType
foi preterida, use-a em vez dissoou
fonte
Confirme se o recurso foi adicionado ao destino de teste.
fonte
se você tiver vários alvos em seu projeto, precisará adicionar recursos entre alvos diferentes disponíveis na Associação ao Alvo e pode ser necessário alternar entre alvos diferentes, conforme as 3 etapas mostradas na figura abaixo
fonte
Eu tive que garantir que esta caixa de seleção Teste Geral estivesse definida
fonte