2016-05-31 7 views
0

ein UIPrintInteractionControllerDelegate geschrieben haben, möchte ich Einheit testen ihre Papierauswahl Funktionalität in printInteractionController:choosePaper:Wie ein UIPrintPaper erstellen UIPrintInteractionControllerDelegate zu testen

Seine Erklärung:

optional func printInteractionController(_ printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper 

Es ist eine einfache Sache, es zu nennen mit vordefinierten UIPrintPaper-Werten und Überprüfung der Ausgabe. Ich kann jedoch keine UIPrintPaper-Instanzen erstellen. Hier ist, wie UIPrintPaper deklariert ist:

NS_CLASS_AVAILABLE_IOS(4_2)__TVOS_PROHIBITED @interface UIPrintPaper : NSObject 

+ (UIPrintPaper *)bestPaperForPageSize:(CGSize)contentSize withPapersFromArray:(NSArray<UIPrintPaper *> *)paperList; // for use by delegate. pass in list 

@property(readonly) CGSize paperSize; 
@property(readonly) CGRect printableRect; 

@end 

Die paper und printableRect Eigenschaften sind nur lesbar und es gibt keine initializer sie zu definieren. Wie kann ich UIPrintPaper erstellen, um verschiedene Papiergrößen für meine Tests darzustellen? (A4, US-Letter, 4x6 ...)

Antwort

1

Kann steuern UIPrintPaper nicht, aber Subklassen es seine Nur-Lese-Eigenschaften außer Kraft zu setzen ist straighforward:

class FakePrintPaper: UIPrintPaper { 

    private let size: CGSize 
    override var paperSize: CGSize { return size } 
    override var printableRect: CGRect { return CGRect(origin: CGPointZero, size: size) } 

    init(size: CGSize) { 
     self.size = size 
    } 
} 
0

Verwenden Sie die UIPrintPaper Klassenmethode bestPaperForPageSize:

let paper = UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: [...]) 

ich denke, Sie würde es so verwenden möchten:

class MyClass: NSObject { } 

extension MyClass: UIPrintInteractionControllerDelegate { 
    func printInteractionController(printInteractionController: UIPrintInteractionController, choosePaper paperList: [UIPrintPaper]) -> UIPrintPaper { 
     return UIPrintPaper.bestPaperForPageSize(CGSize(...), withPapersFromArray: paperList) 
    } 
} 

Wo CGSize ist Ihre Papiergröße.

+0

Es ist das gleiche Problem, wie erstelle ich UIPrintPaper, um diese Methode aufzurufen? (es ist mit PapersFromArray: ist ein Array von UIPrintPaper) – Clafou

+0

@Clafou Bearbeitete meine Antwort für den Ansatz, den ich denke, Sie nehmen möchten. – JAL

+0

Das ist die Implementierung, die ich hatte, aber es stellt sich heraus, dass bestPaperForPageSize nicht immer das tut, was Sie brauchen. Daher muss ich diese Komponententests schreiben (und wahrscheinlich auch meine eigene Logik implementieren - sobald ich Einheitentests schreiben kann). Meine Frage bezieht sich auf das Erstellen von UIPrintPaper, damit ich es testen kann. – Clafou

0

Ich glaube nicht, Sie UIPrintPaper schaffen sollen. Die Apple-API-Aufrufe:

- (UIPrintPaper*)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePaper:(NSArray<UIPrintPaper *> *)paperList 

... auf Ihrem UIPrintInteractionControllerDelegate mit ein Array aller UIPaper von Ihrem Drucker unterstützt. Wenn Sie den gewünschten Drucker nicht erhalten, wird er vom Drucker nicht unterstützt.

Anstatt diesen zu erstellen, implementieren Sie diesen Delegat-Aufruf und geben das richtige UIPrintPaper aus den Parametern zurück, die der Drucker unterstützt.

+0

Richtig, aber wie ich in meiner Frage erklärt habe, brauchte ich das für Unit-Testzwecke. In diesem Fall kann ich mich nicht darauf verlassen, dass ein Drucker die von den Tests benötigten UIPaper-Instanzen bereitstellt. – Clafou

+0

Warum nicht? Genau dafür benutze ich den Druckersimulator.Sie geben an, welches Papier geladen wird. Kommt mit xcode Unterstützung pkg – xaphod

+0

Unit Tests sollen wiederholbar, vollautomatisch und in sich abgeschlossen sein. – Clafou