{"id":19098162,"url":"https://github.com/fsaldivar-dev/experimental-test-tool-swift","last_synced_at":"2026-02-12T16:31:58.576Z","repository":{"id":53928678,"uuid":"521933733","full_name":"fsaldivar-dev/experimental-test-tool-swift","owner":"fsaldivar-dev","description":"Pod creado para facilitar la creación de test mediante código simple","archived":false,"fork":false,"pushed_at":"2024-07-05T23:39:47.000Z","size":147,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-25T17:55:20.694Z","etag":null,"topics":["ios","ios-swift","mock","spy","stubbed-data","swift","test","testing"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fsaldivar-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-08-06T11:56:08.000Z","updated_at":"2024-07-05T23:39:50.000Z","dependencies_parsed_at":"2025-08-04T07:28:52.315Z","dependency_job_id":null,"html_url":"https://github.com/fsaldivar-dev/experimental-test-tool-swift","commit_stats":{"total_commits":40,"total_committers":1,"mean_commits":40.0,"dds":0.0,"last_synced_commit":"1ebdf879f69ad103f2a1acf5d3357eca09809318"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/fsaldivar-dev/experimental-test-tool-swift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsaldivar-dev%2Fexperimental-test-tool-swift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsaldivar-dev%2Fexperimental-test-tool-swift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsaldivar-dev%2Fexperimental-test-tool-swift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsaldivar-dev%2Fexperimental-test-tool-swift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fsaldivar-dev","download_url":"https://codeload.github.com/fsaldivar-dev/experimental-test-tool-swift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsaldivar-dev%2Fexperimental-test-tool-swift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29372182,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T08:51:36.827Z","status":"ssl_error","status_checked_at":"2026-02-12T08:51:26.849Z","response_time":55,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ios","ios-swift","mock","spy","stubbed-data","swift","test","testing"],"created_at":"2024-11-09T03:44:22.215Z","updated_at":"2026-02-12T16:31:58.560Z","avatar_url":"https://github.com/fsaldivar-dev.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# experimental-test-tool-swift\n\n\n\u003cimg width=\"640\" alt=\"Captura de Pantalla 2022-08-08 a la(s) 7 07 24\" src=\"https://user-images.githubusercontent.com/16517868/183414396-108611c1-8585-4ce5-8b4f-088ea4d15f04.png\"\u003e\n\n[![GitHub issues](https://img.shields.io/github/issues/fsaldivar-dev/experimental-test-tool-swift?style=for-the-badge)](https://github.com/fsaldivar-dev/experimental-test-tool-swift/issues)\n[![GitHub forks](https://img.shields.io/github/forks/fsaldivar-dev/experimental-test-tool-swift?style=for-the-badge)](https://github.com/fsaldivar-dev/experimental-test-tool-swift/network)\n[![GitHub stars](https://img.shields.io/github/stars/fsaldivar-dev/experimental-test-tool-swift?style=for-the-badge)](https://github.com/fsaldivar-dev/experimental-test-tool-swift/stargazers)\n[![GitHub license](https://img.shields.io/github/license/fsaldivar-dev/experimental-test-tool-swift?style=for-the-badge)](https://github.com/fsaldivar-dev/experimental-test-tool-swift/blob/main/LICENSE.md)\n![Cocoapods](https://img.shields.io/cocoapods/v/SpockSwift?style=for-the-badge)\n![Cocoapods platforms](https://img.shields.io/cocoapods/p/SpockSwift?style=for-the-badge)\n\nPod creado para facilitar la creación de pruebas únitarias mediante código simple\n\n# Roadmap\n\n|                Roadmap             |    Estado     |\n| -----------------------------------| ------------- |\n| Crear código base                  | ✅            |\n| SwiftPackage                       | ✅            |\n| [CocoaPods](https://cocoapods.org) | ✅            |\n| Example                            | ✅            |\n| [Simple Dummy](./Sources/SpockDummy/assets//SpockableDummy.md)| ✅            |\n| Spy                                | ⌛ 👨‍💻         |\n| Mock                               | ⌛ 👨‍💻         |\n| Stubed                             | ⌛ 👨‍💻         |\n| UnitTest                           | ⌛ 👨‍💻         |\n| Documentación                      | ⌛  👨‍💻        |\n| Extensiones                        | ⌛  👨‍💻        |\n\n\n### Swift Package Manager\nSwift Package Manager es una herramienta para automatizar la distribución de código Swift y está integrado en el compilador Swift. Está en desarrollo temprano, pero experimental-annotation-swift admite su uso en plataformas compatibles.\n\n\nUna vez que haya configurado su paquete Swift, agregar experimental-annotation-swift como dependencia es tan fácil como agregarlo al valor de dependencias de su Package.swift.\n```swift\ndependencies: [\n    .package(url: \"https://github.com/fsaldivar-dev/experimental-test-tool-swift\", .upToNextMajor(from: \"0.0.1\"))\n]\n```\n\n### CocoaPods\n[CocoaPods](https://cocoapods.org) es un administrador de dependencias para proyectos Cocoa. Para obtener instrucciones de uso e instalación, visite su sitio web. Para integrar AnnotationSwift en su proyecto Xcode usando CocoaPods, especifíquelo en su `Podfile`:\n\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\n\n# Integration tests\ntarget 'YOUR_TESTING_TARGET' do\n  pod SpockSwift, '0.0.2'\nend\n```\n\n## [Dummy](./Sources/SpockDummy/assets//SpockableDummy.md)\n**Definición**\nLos objetos Dummy son objetos que no se utilizan en una prueba y solo actúan como marcadores de posición. Por lo general, no contiene ninguna implementación.\n\u003cdetails\u003e\n    \u003csummary\u003eEjemplo\u003c/summary\u003e\n    \n````Swift\n\nstruct User: Codable, SpockDummy {\n  let name: String\n  var lastName: String\n  var age: Int\n  var profession: Profession\n}\n\nstruct Profession: Codable, SpockDummy {\n  var name: String\n  var university: University\n}\n\nstruct University: Codable: SpockDummy {\n   let name: String\n   var country: String\n}\n\nlet user: User = try .dummy()\nprint(user.name) // return \"\"\nprint(user.age) // return 0\nprint(user.profession.name) // return \"\"\nprint(user.profession.university.name) // return \"\"\nprint(user.profession.university.country) // return \"\"\n\nlet user = try Profession.dummy()\nprint(profession.name) // return \"\"\nprint(profession.university.name) // return \"\"\nprint(profession.university.country) // return \"\"\n\nlet university = try University.dummy()\nprint(university.name) // return \"\"\nprint(university.country) // return \"\"\n````\n\u003c/details\u003e\n\n## [Mock](./Sources/SpockMock/assets/SpockMock.md)\n\n| Caracteristica                 |     Estado    |     Test      |\n| -----------------------------  | ------------- | ------------- |\n| Spy                            |       ✅      |       ✅       |\n| Fake return                    |       ✅      |       ✅       |\n|--------------------------------|---------------|--------------  |\n| Soporte a diccionarios         |              ❌                |\n| Documentación                  |              ❌                |\n\nSpockMock librería creada para burlar implementación de funciones.\n\n\u003cdetails\u003e\n    \u003csummary\u003eEjemplo\u003c/summary\u003e\n    \n````Swift\n\nstruct User: Decodable {\n    let name: String\n    let email: String\n    let phone: String\n    let age: Int\n}\n\n\nprotocol Interactor {\n    func fetchAllUserAction() -\u003e [Users]\n}\n\nprotocol View {\n    func showUers(users: [Users])\n}\n\nfinal class Presenter {\n    private let interactor: Interactor\n    private let view: View\n\n    init(view: View, interactor: Interactor) {\n      self.interactor = interactor\n      self.view = view\n    }\n    \n    func loadData() {\n        let result = interactor.getFetchUsers()\n        view.showUsers(users: result)\n    }\n}\n````\n    \n### Mocks\n   \n````Swift\n    \n/// Create Mocks\nfinal class MockInteractor: Interactor, SpockMock {\n    @Stubbed\u003c(), [User]\u003e\n    var fetchAllUserAction\n    func fetchAllUser() -\u003e [Users]\n        try? fetchAllUserAction.onCall(()) ?? []\n    }\n}\n\nfinal class MockView: View, SpockMock {\n    \n    @Stubbed\u003c[User], Void\u003e\n    var showUersAction\n    func showUers(users: [Users]) {\n        try? loadUserListAction.onCall(userList)\n    }\n    \n}    \n````\n   \n#### Test\n    \n````Swift\n    \nextension User: SpockDummy, Equatable {\n    static func == (lhs: User, rhs: User) -\u003e Bool {\n        lhs.name == rhs.name \u0026\u0026\n        lhs.phone == rhs.phone \u0026\u0026\n        lhs.age == rhs.age \u0026\u0026\n        lhs.email == rhs.email\n    }\n}\n\n    \nfinal class SpockMockTest: XCTestCase {\n    var presenter: Presenter!\n    var mockInteractor = MockInteractor()\n    var mockView = MockView()\n    \n    override func setUpWithError() throws {\n        presenter = PresenterImpl(view: mockView,\n                                  interactor: mockInteractor,\n                                  task: mockTask)\n    }\n\n    override func tearDownWithError() throws {\n        presenter = nil\n    }\n\n    func testLoadData() async throws {\n         // Arrage\n        /// Create dummy List\n        let listUserSpected: [User] = [\n            try .dummy(with: .init(at: \"name\", with: \"Fran\")),\n            try .dummy(with: .init(at: \"name\", with: \"Javi\"))\n        ]\n        \n        // wehn call fetchAllUser return list spected\n        mockInteractor.fetchAllUserAction.whenRun { _ in\n            listUserSpected\n        }\n        \n        // Act, execute load data\n        presenter.loadData()\n        \n        // Accert\n        XCTAssert(mockInteractor.isInvoked(stub: { $0.fetchAllUserAction }))\n        XCTAssert(mockView.isInvoked(stub: {$0.showUers}))\n        XCTAssert(mockView.compare(stub: {$0.showUers}, to: listUserSpected))\n    }\n}\n\n````\n\u003c/details\u003e\n\n# Author \u0026 License\n\nProyecto creado por **Francisco Javier Saldivar** [![image](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](www.linkedin.com/in/fsaldivar-dev)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffsaldivar-dev%2Fexperimental-test-tool-swift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffsaldivar-dev%2Fexperimental-test-tool-swift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffsaldivar-dev%2Fexperimental-test-tool-swift/lists"}