2016-03-09 50 views
5

Ben Bluetooth Low Energy yoluyla çevre birimleri ile iletişim kurmak için elma CoreBluetooth çerçevesini kullanan Swift ile bir iOS app inşa ediyorum test eder. CBCentralManagerDelegate ve CBPeripheralDelegate protokolleri, bir CoreBluetooth API davranışını taklit etmek için çift CBCentralManager den sınıflandırma bir test sağlayan am uygulayan özel bir kontrolör test ünitesinin çaba. Denetleyicinin temsilci geri bildirimleri uygun zamanlarda çağrılır. alaycı Kakao nesneleri

Şimdiye kadar bu oldukça iyi çalışıyor. o CBPeripheralDelegate geri aramalar çağıran gelince, bir CBPeripheral geçirilen gerekiyor. Genellikle, bileşen kendi alt sınıf sağlamak veya bir örneğini CBPeripheral alay sadece sahte olur.

İşte yakalamak var: altta yatan Objective-C kütüphanesinde belirlenmiş başlatıcı CBPeripheral benim sahte CBCentralManager bir CBPeripheral başlatmasını ve bir argüman olarak geçen beni engelleyen kullanılamaz olarak işaretlenir test edilen CBPeripheralDelegate. (XCode beni bir derleyici hatası ile bırakır.)

Şimdiye kadar, sahte alt sınıfımda (ki bu, kullanılmayan atanmış init'i aramak zorunda olduğum için işe yaramıyor) özel bir başlatıcı sağlamayı denedim, başlatıcıyı (görünüşte izin verilmez) uzantısı ve kullanılamadığını umrumda değilmiş gibi Objective-C çalışma zamanı ile seçicisini (init) çağırarak. Son yaklaşım en umut verici görünüyor, ama gerçekten çalışmıyor ve yanlış tipte (test sınıfım) yönetilmeyen nesnelerle beni terk ediyor.

Kesinlikle burada bir barikat isabet ettik ve) (init rağmen CBPeripheral başlatmasını

  • farklı bir yaklaşım kullanılamaz olmak

    1. üzerinde herhangi bir giriş için son derece mutluluk duyarız CBPeripheralDelegate

    2. test birimi için
  • cevap

    2

    Nesc-çalışma zamanı fikrini izleyerek ve Objective-C'de bir Object Factory oluşturarak, başlatıcı işaretini kullanamaz işaretini görmezden gelerek başlatıcıyı çağrıştırarak sorunu kendim çözdüm. Ayrıntılı bilgi için

    bkz: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/ (Bu akım Swift de artık çalışmıyor ama kolayca adapte edilebilir)