Ich bin ein erfahrener Objective-c-Programmierer, aber ich kann nicht das Gleiche für Swift sagen, ich habe eine harte Zeiteinheit, die eine Klasse in swift testet, ohne Frameworks wie OCMock zu verwenden.
Das Problem : Ich integriere Firebase in ein gemischtes Objective-C / Swift-Projekt und muss es basierend auf der Build-Konfiguration der App konfigurieren.
Ich habe eine Swift-Klasse dafür geschrieben (die vom obj-c-App-Delegaten verwendet wird), aber da das Firebase-Framework über eine statische Klassenmethode konfiguriert ist, genau FIRApp.configure(with: FIROptions)
, muss ich diese Methode vortäuschen irgendwie um es zu testen.
Mein Code ohne Handle für Dependency Injection sieht so aus:
%Vor%Ich habe einige Nachforschungen angestellt, aber bis jetzt habe ich nichts gefunden, was zu meiner Lösung passt, aber ich habe an eines der folgenden Dinge gedacht:
FIRApp.configure(with:)
ist, aber ich sollte dies von objective-c tun und die Funktion akzeptiert auch einen Parameter, ich habe mit der Syntax Als Referenz (sowohl persönlich als auch für diejenigen, die es brauchen könnten) sind dies einige der Ressourcen, die ich nützlich fand und auf denen ich weiter graben werde:
In der Zwischenzeit wird jede Hilfe sehr geschätzt.
Als Nebenbemerkung gibt es viele Möglichkeiten, wie ich dieses Problem lösen kann, ohne mich mit einer statischen Klassenmethode herumärgern zu müssen, aber mein Ziel ist es, eine Art zu verspotten, um die Best Practices besser zu verstehen komplexere Situationen testen.
Sie können tatsächlich jeden von denen tun.
Sie können festlegen, dass Ihre configureFirebase
-Funktion eine "Anwendungs" -Schließung verwendet, die standardmäßig auf die ursprüngliche verwendet wird:
Sie benötigen ein Configurable
-Protokoll und passen es dann für den Standardfall FIRApp
an:
Wenn Sie dies nur in einer Methode verwenden, ist es lediglich ein Übergangszustand, und es sollte wahrscheinlich ein Funktionsargument und keine gespeicherte Eigenschaft sein.
(Wenn unklar ist, ob es sich um einen persistenten oder transienten Zustand handelt, weil der ganze Sinn der Klasse darin besteht, eine einzelne Funktion aufzurufen, brauchen Sie vielleicht gar keine Klasse, nur eine Funktion.)
Tags und Links unit-testing dependency-injection swift swift-protocols xctest