2016-02-22 7 views
1

Мой предыдущий подход в Objective-C для модульного тестирования было как следующее:Вызов метода в Swift Unit Tests

  • Вызов открытый метод: нет проблем
  • Calling частный метод: создать категорию, что класс в тестовом файле блока и поставить подпись частного метода в этой категории

в настоящее время я следующее:

  • класса разработан в ObjC
  • Протокол разработан в Swift
  • Юнит-тесты для этого класса разработан в Swift

Класс Соответствует (непосредственно, в его открытом интерфейсе (.h)) к этому протоколу. У меня есть экземпляр класса в моих модульных тестах, но почему-то я не могу вызывать метод, объявленный в протоколе над этим экземпляром.

Теперь решение старой категории не работает с расширениями. Когда я добавляю некоторую сигнатуру метода в расширение, я получаю эту ошибку, говорящую «Тело функции, ожидаемое в объявлении».

Как я могу назвать функции с помощью Swift наилучшим образом?

PS: Я не хочу снова объявлять метод в открытом интерфейсе класса, что является уродливым решением.

+0

Вы пытались импортировать модуль с помощью '@testable import ' в вашем классе Swift? Он должен делать именно то, что вы хотите, то есть «открывать» доступ к частным материалам тестируемого класса для тестирования, не заставляя вас изменять видимость. Это [что они говорят] (https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_7_0.html): _ «Использовать @testable import {ModuleName} в вашем тестовом источнике кода, чтобы все общедоступные и внутренние подпрограммы использовались по целям XCTest, но не по другим целевым объектам и приложениям. "_ – courteouselk

+1

Помните; @testable позволяет только защищенным членам тестироваться, частные методы, функции и параметры по-прежнему недоступны. – Abizern

+0

Это не работает. – antonio

ответ

0

В соответствии с документацией на «Написание тестов с Swift» here:

Xcode предоставляет две части решение этой проблемы:

Когда вы установите Включить Тестируемость сборку установки Да , который равен true по умолчанию для тестовых построений в новых проектах, Xcode включает флаг во время компиляции . Это означает, что объекты Swift, объявленные в скомпилированном модуле, имеют право на более высокий уровень доступа. Когда вы добавьте атрибут @testable в оператор импорта для модуля , скомпилированный с включенным тестированием, вы активируете повышенный доступ для этого модуля в этой области. Классы и члены класса, помеченные как , ведут себя или ведут себя так, как если бы они были помечены как открытые. Другие субъекты обозначены как внутренние, как если бы они были объявлены публичными.

Здесь также пример (для MySwiftApp)

  • класса, построенный для мишени с Enable Тестируемость набор для да

    import Cocoa 
    @NSApplicationMain 
    
    class AppDelegate: NSObject, NSApplicationDelegate { 
        @IBOutlet weak var window: NSWindow! 
        func foo() { 
    
        println("Hello, World!") 
        } 
    } 
    
  • модульного тестирования класса

    // Importing XCTest because of XCTestCase 
    import XCTest 
    
    // Importing AppKit because of NSApplication 
    import AppKit 
    
    // Importing MySwiftApp because of AppDelegate 
    @testable import MySwiftApp 
    
    class MySwiftAppTests: XCTestCase { 
        func testExample() { 
         let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 
         appDelegate.foo() 
        } 
    } 
    

Также см важное примечание

Примечание: @testable обеспечивает доступ только для внутренних функций; Файлы-частные и частные объявления не видны за пределами их обычных областей применения при использовании @testable.