2016-11-15 11 views
0

에 나는 그것이 평등 구현을 그리워 쉽게 많은 특성을 가진 복잡한 객체가있는 경우 신속 객체Equatable 테스트 스위프트

의 평등을 테스트하는 모범 사례에 대한 제안을 찾고 있어요.

평등 구현을 시행하는 좋은 방법은 무엇입니까?

자세한 내용 : 물론 , 당신은 때 그들이해야 두 값이 동일한 지 확인하기 위해 테스트를 작성할 수 있지만, 문제는 여기이 쉽게 깰 수 있다는 것입니다. 프로젝트에 구조체가 있습니다. 6 개월 후에 다른 개발자가 해당 구조체에 속성을 추가합니다. 그는 동등성에 속성을 추가하는 것을 잊었다 고 가정합니다. 평등은 여전히 ​​작동하지만 테스트는 통과하지만 해당 속성 만 변경되면 앱이 중단됩니다. 내 질문은,이 문제를 피할 수있는 방법이 있습니까?

평범하지 않은 응용 프로그램에서는 실제로 10 개의 값을 가진 모델 객체가 있고 결국 중첩 된 모델 객체를 사용하기 쉽습니다. 그렇다면 어떻게하면 내 모델 객체의 평등성을 제어 할 수 있을까요? 평등 구현에서 인간의 실수 위험을 줄이려면 어떻게해야합니까?

가능한 해결 방법 : 내가 생각하고있는 하나의 솔루션은 모든 클래스/구조체를 들어 특정 프로토콜

Diffable : Equatable {} 

을 준수 클래스와 구조체에 대한 컴파일시에 보이는 스크립트를 작성하는 것입니다 내가 테스트 클래스 Foo_Tests_Diffable

에 대해 살펴 보겠습니다 클래스 Foo를 들어

: 나는 테스트 파일의 실존을 확인합니다 Diffable, 즉 채택 다음 이름 패턴에 부합 내가 테스트 함수의 실존을 확인합니다 Foo 내부의 모든 속성보다

test<property name>Diffable

예 :

class Foo : Diffable { 
    var title: String 
    var color: UIColor 
    var tag: Tag 
} 
내가 확인합니다

다음 내부 시험 Foo_Tests_Diffable

func testTitleDiffable { 
// Test 
} 

func testColorDiffable { 
// Test 
} 

func testTagDiffable { 
// Test 
} 

모든 스크립트 핀 DS 컴파일 단계 패스보다 모든 예상 시험은, 그렇지 않으면

실패하지만 그래서 어떤 제안을 환영합니다

+0

글쎄, 당신이 바로, 테스트를 추가하고 그 이유는? ;) 모든 필드가 같을 때 동등한 것으로 간주되어야한다면'struct'로 선언하는 것이 좋습니다. – redent84

+0

물론 두 값이 같아야한다는 것을 확인하기위한 테스트를 작성할 수는 있지만 문제는 쉽게 깨질 수 있다는 것입니다. 프로젝트에 구조체가 있습니다. 6 개월 후에 다른 개발자가 해당 구조체에 속성을 추가합니다. 그는 평등에 속성을 추가하는 것을 잊어 버린다고 가정합니다. 평등은 여전히 ​​작동하지만 테스트는 통과하지만 해당 속성 만 변경되면 앱이 중단됩니다. 내 질문에이 문제를 방지 할 수있는 방법이 있습니까? –

+0

질문 제목과 본문을 확장하여 의견을 고려하십시오. 웬일인지 그 의견은 나에게 숨겨져 있었고 나는 당신에게 거의 사용하지 않는 대답을 썼다. – CloakedEddy

답변

0

I이며,이 솔루션은 시간이 많이 걸리는 것하고 내가 그것을 구현할 수 있을지 모르겠어요 이 목적을 위해 특별히 단위 테스트을 만들 것입니다.

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() 
    { 
     /* ... */ 
    } 
} 

참고 :이 Equatable 세부 사항을 구현하기 전에 테스트 케이스 를 작성하는 경우, 당신은 실제로 매우 멋진 TDD를하고있어!

+0

고마워요.하지만 제 질문에 대한 논평에서 썼습니다. 내 문제는 클래스 또는 구조체에 대한 "미래의 변화"를 잡고 싶다는 것입니다. 6 개월 후에 속성을 추가하면 동등성을 업데이트해야한다는 사실을 알 수 있습니다 –

0

나는 그것을 많이 시도하지는 않았지만 스위프트는 리플렉션 기능을 가지고 있습니다.

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

그래서 귀하의 경우, 당신은 클래스를 미러링 할 수 있습니다 다음 테스트에 어떤 조건을 넣어.

예를 들어, 테스트에서 클래스의 수정 번호 나 속성을 설정할 수 있습니다.

aMirror.children.count 

내가 놀이터에서 간단한 예제를 쓴 나는 방법 변수를 추가하면, 아이들은 증가 수 :
let nbAttributes = 6 

다음 그것을 확인합니다. 비록 그것이 방법을 확인하는 것이 가능한지 나는 모른다.

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

    } 
} 

let toto1 = toto() 

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

다른 링크 : Reflection in swift 2

희망하는 데 도움이 :