2012-03-06 2 views
0

내가 두 구조체가 동일하다는 것을 주장하고 싶은 말 :어설 구조체 평등

// Using CGPoint here for brevity, but my question applies to any struct type 
CGPoint a = CGPointMake(1, 2); 
CGPoint b = CGPointMake(1, 2); 
STAssertEquals(a, b, @"this works"); 
assertThat(a, equalTo(b)); 

위의 STAssertEquals처럼 작동 Hamcrest를 사용하여 주장을 작성하는 방법은 없습니다? assertThat 행은 매크로가 id 매개 변수를 필요로하므로 컴파일되지 않습니다. 구조체는 그렇지 않습니다. sameInstance과 같은 equalTo 정규 표현식을 시도했지만 모두 입력 된 매개 변수가 id 인 것 같습니다. 다음으로 임의의 표현식에 YES 또는 NO 값이 있다고 주장하는 것이 좋습니다. 이런 식으로 뭔가 :

assertThat(a == b); 

나이 :

assertThat(a == b, isTrue()); 

하지만 Hamcrest이 같은 아무것도 표시되지 않습니다.

나는 분명한 뭔가를 놓치고 있습니까? 분명히 나는 ​​STAssertEquals과 같은 SenTest 매크로를 사용하여 원하는 작업을 수행 할 수 있지만, 모든 내 주장이 일관된 스타일을 갖도록 Hamcrest를 사용하여 이러한 어설 션을 구현하는 것이 간단 할 것으로 예상했습니다.

나는 내가 비교할 특정 구조체에 대해 사용자 정의 Hamcrest 정규 표현식을 구현하여이 작업을 수행 할 수 있음을 알고 있습니다. 하지만 난 정말 간단한 assertion/matcher 그냥 C structs 간단한 bytewise 평등을 비교할 수있는 찾고 있었다.

아마도 내가 언급 한 가능성 중 아무 것도 Hamcrest와 함께 사용할 수없는 경우 일 것입니다. 그것이 사실이라면 나는이 효과에 대한 설득력있는 설명을 답으로 받아 들일 것입니다.

답변

0

OCHamcrest가 일치를위한 객체들을 확인하도록 설계

덕분 때문에 assertThat 첫번째 파라미터 (및 제로서 정규)와 같은 인수 걸린다.

스칼라는 제한적으로 지원됩니다. 예를 들어, 당신은 변화가 NSValue의 정규 나에게 보냈습니다

assertThatInteger(a, equalToInteger(b)); 

말할 수있는,하지만 난 아직 검토 할 시간이 없었어요. NSPoint, NSSize 등의 문을 엽니 다.하지만 여전히 OCHamcrest의 스칼라 지원은 해결 방법입니다.

구조체의 경우 STAssertEquals을 사용합니다. 문제는 모든 것이 든 아무것도없는 평등 비교이며 테스트가 취약해질 수 있습니다. 그렇게되면 필드 당 일치를 지원하는 사용자 지정 matcher를 작성하는 것이 더 좋을 것입니다. NSValue matcher를 하위 클래스로 만들려고 노력할 것입니다.

+0

감사합니다. 나는 두 가지 요소 이상으로 구조체의 도매 평등 테스트가 부서지기 쉬운 테스트를 할 수 있다는 것에 동의한다. 그것은 나를 위해 사용의 많은 것을 보는 것이 어렵습니다. –