swift testing swift-package-manager

Prueba de Swift da error "Símbolos indefinidos para arquitectura x86_64"



testing swift-package-manager (6)

Añadir a la respuesta de @ Frank.

En Swift 4, verifique si su .testTarget depende de FooBarLib .

.testTarget( name: "FooBarLibTests", dependencies: ["FooBarLib"]),

Estoy ejecutando swift test desde la línea de comandos para ejecutar los casos de prueba. Este es el caso de prueba:

import XCTest @testable import vnk_swift class KeyMappingTests: XCTestCase { static var allTests : [(String, (KeyMappingTests) -> () throws -> Void)] { return [ // ("testExample", testExample), ] } func testExample() { let keyMapping = KeyMapping() XCTAssertNotNil(keyMapping , "PASS") } }

Y aquí está el mensaje de salida.

Si KeyMapping el uso de KeyMapping , todo funciona bien:

func testExample() { // let keyMapping = KeyMapping() XCTAssertNotNil(true , "PASS") }

Parece que hay un problema cuando intento usar una clase. ¿Cómo puedo solucionar esto?

(No utilicé XCode para este proyecto porque empecé con swift package init , el código fuente de este proyecto está aquí: https://github.com/trungdq88/vnk-swift )


Aprovechando la respuesta de @ Cristik, realmente se reduce a lo que está en su carpeta de Sources . Para mí, tenía una carpeta en Sources que necesitaba ser exactamente la misma que en las Tests excepto que lo que estaba en las Tests tenía que tener el sufijo de las Tests . Por lo tanto, si tiene Sources -> Foo-Bar , debe tener Tests -> Tests Foo-BarTests . SIN EXCEPCIONES .

Otra nota: todos los guiones se convertirán en guiones bajos, por lo que en la parte superior de los archivos de prueba, deberá agregar @testable import Foo_Bar .


En mi caso, habilito la prueba, voy a mostrar el navegador de prueba en xcode, hago clic derecho y habilito la prueba. Y funcionó.


Logré construir y probar su paquete con éxito haciendo las siguientes modificaciones:

  • renombrado el nombre del paquete a VnkSwift , por algunas razones, a la herramienta de compilación no le gustan los guiones en el nombre del paquete, ni funciona cuando tiene guiones bajos en el nombre del paquete generado (así que vnk_swift el nombre del paquete a vnk_swift para asegurarse de que la declaración de importación y el paquete coincidencia de nombre no funcionó)
  • cambió el nombre de la carpeta de prueba a VnkSwiftTests para que el vinculador sepa con qué vincular; Parece que esta es una condición previa para que el vinculador sepa que se debe vincular con el paquete.
  • finalmente, renombrado main.swift a otra cosa (utilicé utils.swift ). El problema es que la presencia de main.swift indica a la herramienta de compilación que genere un ejecutable, y que la vinculación con un ejecutable no funciona muy bien. Después del cambio de nombre, tuve que comentar el código if , ya que el código de ejecución global solo puede pertenecer a main.swift .

Para concluir:

  • Evite los nombres de paquetes no alfanuméricos
  • El nombre del paquete y el nombre del directorio de prueba deben estar sincronizados
  • Asegúrese de no tener un archivo main.swift para asegurarse de que el paquete se pueda vincular con

Parece que esto se debe a que tengo un main.swift en el directorio de su módulo. Esto hace que se genere un ejecutable, en lugar de una biblioteca con la que se pueden vincular los casos de prueba.

Resolví este problema dividiendo mi código en dos módulos. Una biblioteca para la que tengo casos de prueba y la aplicación que solo contiene main.swift:

Package.swift Sources/FooBarLib/ Sources/FooBarLib/Something.swift Sources/FooBarLib/MoreStuff.swift Sources/FooBarApp/main.swift Tests/FooBarLibTests/TestSomething.swift

Luego, en mi Package.swift, asegúrate de que FooBarApp dependa de FooBarLib

import PackageDescription let package = Package( name: "FooBar", targets: [ Target(name: "FooBarLib"), Target(name: "FooBarApp", dependencies: ["FooBarLib"]) ], )

Luego, en TestSomething.swift, importa el módulo FooBarLib

@testable import FooBarLib import XCTest class TestSomething: XCTestCase { func testFunc() { } }


Veo que en los directorios tienes vnk-swift , pero en las declaraciones de importación y en el nombre mutilado tienes vnk_swift . Tal vez este es un error de xCode / compiler con el manejo de guiones. Intente reproducir en un directorio y proyecto sin un guión en el nombre, solo vnkswift por ejemplo.

Espero eso ayude