2016-11-15 4 views
0

Ich suche nach Anregungen über bewährte Praktiken, die Gleichstellung von schnellen Objekten zu testengleichzusetzen Testing in Swift

Wenn ich ein komplexes Objekt mit vielen Eigenschaften ist es einfach, die Gleichheit Umsetzung zu verpassen.

Was sind die guten Praktiken, um die Umsetzung der Gleichstellung durchzusetzen?

Weitere Details: Natürlich können Sie Tests schreiben zu überprüfen, ob zwei Werte gleich sind, wenn sie sollen, aber das Problem ist, dass diese leicht brechen können. Sie haben eine Struktur in Ihrem Projekt, nach sechs Monaten fügt ein anderer Entwickler dieser Struktur eine Eigenschaft hinzu. Angenommen, er vergisst, die Eigenschaft der Gleichheit hinzuzufügen. Die Gleichheit funktioniert immer noch, die Tests werden bestanden, aber Ihre App wird nur dann unterbrochen, wenn sich diese Eigenschaft ändert. Meine Frage ist, gibt es eine Möglichkeit, dieses Problem zu vermeiden?

In einer nicht trivialen App ist es wirklich einfach, am Ende Modellobjekte mit 10 Werten zu haben und verschachtelte Modellobjekte zu verwenden. Wie kann ich also die Gleichheit meiner Modellobjekte unter Kontrolle halten? Wie kann ich das menschliche Fehlerrisiko bei der Umsetzung der Gleichstellung reduzieren?

Mögliche Lösung: Eine Lösung, die ich im Sinne habe, ist es, ein Skript zu schreiben, die für Klassen und Struktur, die zu einem bestimmten Protokoll entspricht

Diffable : Equatable {} 

Für alle Klassen/Strukturen bei der Kompilierung sieht, dass adoptieren Diffable ich für die Existenz einer Testdatei überprüfen werden, das heißt:

für die Klasse Foo ich für eine Testklasse aussehen werden Foo_Tests_Diffable

als für alle Objekte innerhalb Foo ich für die Existenz einer Testfunktion, die

test<property name>Diffable

dem folgenden Namensmuster entsprechen überprüfen werden

dh:

class Foo : Diffable { 
    var title: String 
    var color: UIColor 
    var tag: Tag 
} 

ich überprüfen werde die folgenden Tests innerhalb Foo_Tests_Diffable

func testTitleDiffable { 
// Test 
} 

func testColorDiffable { 
// Test 
} 

func testTagDiffable { 
// Test 
} 

Wenn alle Skript fin ds all erwarteten Tests als der Kompilierung Pass, sonst scheitert es

Aber diese Lösung es zeitaufwendig, und ich weiß nicht, ob ich in der Lage sein werde, es zu implementieren, so dass jeder Vorschlag willkommen

+0

Nun, das ist, warum Sie Tests sind das Hinzufügen, nicht wahr? ;) Es ist eine gute Übung, es als "struct" zu deklarieren, wenn es als gleich angesehen werden soll, wenn alle Felder gleich sind. – redent84

+0

Natürlich können Sie Tests schreiben, um zu überprüfen, dass zwei Werte gleich sind, wenn sie sollten, aber das Problem hier ist, dass dies leicht brechen kann. Sie haben eine Struktur in Ihrem Projekt, nach sechs Monaten fügt ein anderer Entwickler dieser Struktur eine Eigenschaft hinzu. Angenommen, er vergisst, die Eigenschaft der Gleichheit hinzuzufügen. Die Gleichheit funktioniert immer noch, die Tests werden bestanden, aber Ihre App wird nur dann unterbrochen, wenn sich diese Eigenschaft ändert. Meine Frage ist, gibt es eine Möglichkeit, dieses Problem zu vermeiden? –

+0

Bitte erweitern Sie den Titel und den Text Ihrer Frage, um Ihren Kommentar zu berücksichtigen. Aus irgendeinem Grund waren die Kommentare für mich verborgen und ich schrieb eine Antwort von wenig Nutzen für Sie. – CloakedEddy

Antwort

0

I würde speziell für diesen Zweck Komponententests erstellen.

class YourObjectEquatableTests: XCTestCase 
{ 
    func testPropertyOne() 
    { 
     var object1 = /* ... */ 
     var object2 = /* ... */ 

     object1.propertyOne = nil 
     object2.propertyOne = nil 

     XCTAssertEqual(object1, object2) 
     object1.propertyOne = "different value" 
     XCTAssertNotEqual(object1, object2) 

     /* etcetera */ 
    } 

    func testPropertyTwo() 
    { 
     /* ... */ 
    } 
} 

Hinweis: Wenn Sie Ihre Testfälle vor Umsetzung der gleichzusetzen Details schreiben, sind Sie tatsächlich TDD tun, was sehr cool ist!

+0

Danke, aber wie ich im Kommentar zu meiner Frage schrieb. Mein Problem ist, dass ich zukünftige Änderungen an der Klasse oder Struktur "fangen" möchte. Wenn Sie eine Eigenschaft in sechs Monaten hinzufügen, können wir feststellen, dass die Gleichheit aktualisiert werden muss –

0

Ich habe es nicht viel versucht, aber Swift hat Reflection Fähigkeiten.

https://appventure.me/2015/10/24/swift-reflection-api-what-you-can-do/

Also in Ihrem Fall können Sie eine Klasse spiegeln und dann einige Bedingungen in der Probe.

können Sie beispielsweise eine Fixnummer oder ein Attribut oder Methoden für eine Klasse in Ihrem Test festlegen.

let nbAttributes = 6 

und dann überprüfen:

aMirror.children.count 

ich ein einfaches Beispiel auf dem Spielplatz geschrieben und wenn ich eine Methode Variable hinzufügen, zählen die Kinder erhöht. Ich weiß nicht, ob es möglich ist, die Methoden zu überprüfen.

class toto{ 
    var io = 9 
    var tutu = "yo" 
    func test(){ 

    } 
} 

let toto1 = toto() 

let aMirror = Mirror(reflecting: toto1) 
aMirror.children.count 

ein weiterer Link: Reflection in swift 2

Hoffnung, das hilft :)

Verwandte Themen