Eu simplesmente quero incluir minha classe Swift de outro arquivo, como seu teste
PrimeNumberModel.swift
import Foundation
class PrimeNumberModel { }
PrimeNumberModelTests.swift
import XCTest
import PrimeNumberModel // gives me "No such module 'PrimeNumberModel'"
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel() // "Use of unresolved identifier 'PrimeNumberModel'"
}
Os dois arquivos rápidos estão no mesmo diretório.
Respostas:
Eu tive o mesmo problema, também nos meus
XCTestCase
arquivos, mas não nos arquivos regulares do projeto.Para se livrar do:
Eu precisava
import
do módulo base no arquivo de teste. No meu caso, meu destino é chamado 'myproject' e eu adicioneiimport myproject
e a classe foi reconhecida.fonte
public
. Caso contrário, aXCTestCase
subclasse não poderá "ver" o que você está tentando testar. Eu desperdiçado algumas horas nesta última noite :)import
declaraçãoATUALIZAÇÃO Swift 2.x, 3.x, 4.xe 5.x
Agora você não precisa adicionar
public
os métodos aos testes para então. Nas versões mais recentes do Swift, é necessário apenas adicionar a@testable
palavra - chave.PrimeNumberModelTests.swift
E seus métodos internos podem manter
Internal
PrimeNumberModel.swift
Observe que os símbolos
private
(efileprivate
) não estão disponíveis mesmo com o uso@testable
.Swift 1.x
Existem dois conceitos relevantes da Swift aqui (como Xcode 6 beta 6).
Internal access
Considerando que os testes estão em outro destino,
PrimeNumberModelTests.swift
você precisaimport
do destino que contém a classe que deseja testar, se o seu destino for chamado,MyProject
será necessário adicionarimport MyProject
aoPrimeNumberModelTests
:PrimeNumberModelTests.swift
Mas isso não é suficiente para testar sua classe
PrimeNumberModel
, já que o nível padrão de Controle de Acesso é queInternal Access
sua classe não estará visível para o pacote de teste, portanto, você precisa fazer issoPublic Access
e todos os métodos que deseja testar:PrimeNumberModel.swift
fonte
No such module <moduleName>
erro de compilação no seu caso de teste, convém verificar oPRODUCT_MODULE_NAME
destino do teste. Ótima resposta Diogo.Na documentação , diz que não há instruções de importação no Swift.
Basta usar:
fonte
Verifique a associação ao destino de PrimeNumberModel.swift no seu destino de teste.
fonte
No Objective-C, se você quiser usar uma classe em outro arquivo, precisará importá-lo:
No entanto, no Swift, você não precisa importar. Basta usá-lo como se já estivesse importado.
Exemplo
Como você pode ver, nenhuma importação foi necessária. Espero que isto ajude.
fonte
De acordo com a Apple, você não precisa de uma importação para arquivos rápidos no mesmo destino. Finalmente consegui trabalhar adicionando meu arquivo rápido ao meu objetivo comum e ao objetivo de teste. Em seguida, usei o cabeçalho da ponte para teste para garantir que meus arquivos ObjC que eu referenciei no meu cabeçalho de ponte normal estavam disponíveis. Corria como um encanto agora.
Portanto, verifique se o PrimeNumberModel tem um destino para o seu destino de teste. Ou a solução High6 de importar todo o módulo funcionará
fonte
Consegui resolver esse problema limpando minha compilação.
Menu superior -> Produto -> Limpar ou atalho de teclado: Shift+ Cmd+K
fonte
A partir do Swift 2.0, a melhor prática é:
Adicione a linha
@testable import MyApp
na parte superior do seu arquivo de testes, em que "MyApp" é o Nome do módulo do produto do seu destino de aplicativo (visível nas configurações de compilação do seu destino de aplicativo ). É isso aí.(Observe que o nome do módulo do produto será o mesmo do destino do seu aplicativo, a menos que o nome do destino do aplicativo contenha espaços, que serão substituídos por sublinhados. Por exemplo, se meu destino do aplicativo se chamar "Jogo divertido", eu escreveria
@testable import Fun_Game
no topo dos meus testes.)fonte
Você precisa adicionar uma rotina para o compilador fazer referência como um ponto de entrada; portanto, adicione um arquivo main.swift, que nesse caso simplesmente cria uma instância do seu arquivo de teste:
main.swift
Em seguida, compile na linha de comando (estou usando El Capitan e Swift 2.2):
Nesse caso, você receberá um aviso: o resultado do inicializador não é usado , mas o programa compila e é executável:
CAVEAT: removi os tipos de importação XCTest e XCTestCase por simplicidade.
fonte
Verifique suas
PrimeNumberModelTests
configurações de destino.Se você não conseguir ver o
PrimeNumberModel.swift
arquivo no BuildPhases/Compile Sources
, adicione-o.fonte
Então, você precisa
No meu caso, eu tinha um arquivo rápido que queria fazer teste de unidade, e o arquivo de teste de unidade também era uma classe rápida. Verifiquei se os modificadores de acesso estavam corretos, mas a declaração
(digamos que stMobile é o nosso nome de destino)
ainda não funcionou (eu ainda estava recebendo o erro 'Não existe esse módulo'), verifiquei meu destino e seu nome era realmente stMobile. Então, eu fui para Build Settings, embaixo da embalagem, e encontrei o Product Module Name e, por algum motivo, isso foi chamado St_Mobile, então mudei minha declaração de importação
(que é o nome do módulo do produto ) e tudo funcionou.
Entao, para resumir:
Verifique o nome do módulo do produto e use a declaração de importação abaixo na sua classe de teste de unidade
Verifique se seus modificadores de acesso estão corretos (nível de classe e seus métodos).
fonte
Em vez de exigir importações explícitas, o compilador Swift procura implicitamente
.swiftmodule
arquivos de bibliotecas Swift de dependência.O Xcode pode criar módulos rápidos para você, ou consulte o blog do railsware para obter instruções sobre a linha de comando
swiftc
.fonte
Como @ high6 e @ erik-p-hansen apontaram na resposta dada por @ high6, isso pode ser superado importando o destino para o módulo onde está a classe PrimeNumberModel, que provavelmente é o mesmo nome do seu projeto em um projeto simples .
Enquanto olhava para isso, deparei-me com o artigo Escreva seu primeiro teste de unidade no Swift no swiftcast.tv de Clayton McIlrath. Ele discute os modificadores de acesso, mostra um exemplo do mesmo problema que você está tendo (mas para um ViewController em vez de um arquivo de modelo) e mostra como importar o destino e resolver o problema do modificador de acesso, incluindo o arquivo de destino no destino, o que significa você não precisa tornar pública a classe que está tentando testar, a menos que realmente queira fazê-lo.
fonte