2013-01-21 2 views
1

와 목표 - C에서 호출합니다. 이 배열의 내용은 address, datacommandType에 따라 다릅니다. 내 테스트에서 올바른 배열이 빌드되어 -sendBuffer:length:에 전달되었는지 확인하려고합니다. OCMock은 uint8_t * 인수에 대한 기대치를 설정하지 않습니다. OCMockito/OCHamcrest는 (아직) 부분 모의를 사용하지 않을 것입니다. 내 테스트 사례 클래스에서 메서드를 호출하고 그 메서드 호출에 대한 기대치를 설정하는 방법으로 -sendBuffer:length: 메서드를 시도해 보았습니다. 그러나 swizzled 메서드가 호출 될 때 self은 테스트 케이스 대신 테스트중인 클래스를 가리 킵니다. 테스트중인 클래스의 버퍼를 유지 한 다음 테스트에서이 버퍼의 내용을 확인할 수는 있지만 테스트를 지원하기 위해 프로덕션 코드에 무언가를 추가하는 것은 싫어합니다. 누구든지이 동작을 테스트하는 방법에 대한 더 나은 제안이 있습니까?확인 방법은 내가 테스트를 해요 내가 클래스에서 두 가지 방법이 원시적 배열/포인터 인수

답변

0

이것은 논증의 여지가 있지만 포괄적 인 단위 테스트의 이점은 코드 복잡성의 증가를 보완하고 보람있는 트레이드 오프를 제공합니다. 당신이 설명하는 경우, 나는 생산 클래스에 버퍼를 추가하여 전송 된 마지막 바이트 시퀀스를 검색하여 단위 테스트에서 주장 할 수 있다고 생각합니다. 완벽하게 잘 접근 할 수 있습니다.

대용량 메시지가 프로덕션 코드로 전송되면 우발적 인 불필요한 메모리 오버 헤드를 방지하기 위해 개인적으로 버퍼가 유지 관리되는지 여부를 제어하는 ​​부울 속성을 추가 할 수 있습니다. 단위 테스트 설정은 물론이 속성을 설정하지만 응용 프로그램/프레임 워크 생산 코드는 그렇지 않습니다. 다시 말하지만, 핵심은 추가 된 코드를 그렇게 간단하게 만들어서 분명히 맞도록하는 것입니다. :-)

프로덕션 클래스가 노출하는 인터페이스에 대해 엄격하거나 엄격하게 지정해야하는 경우 버퍼 유지 관리 코드를 조건부 컴파일에 종속되게 만들 수도 있습니다. 나는 개인적으로 이전 접근법을 선호하지만, 각자 자신에게만 접근한다.

0

모의 프레임을 만들 필요가 없습니다. 도전, 내가 받아, 당신은 실제로 -sendBuffer:length:에 전화하고 싶지 않다는 것입니다. 이 경우, Michael Feathers의 저서 레거시 코드에서 효과적으로 설명한 하위 클래스 및 재정의 메서드를 사용하기 만하면됩니다.

클래스 이름을 모르는 경우 발신자라고 부릅니다. 이것은 내가 똑바로 SenderTest.m에 그것을 넣어 쓸 것 인 것이다 :

@interface TestingSender : Sender 
@property (assign, nonatomic) NSUInteger sendBufferCount; 
@property (assign, nonatomic) uint8_t *sendBufferBuffer; 
@property (assign, nonatomic) NSUInteger sendBufferLength; 
@end 

@implementation TestingSender 

- (NSUInteger)sendBuffer:(uint8_t *)buffer length:(NSUInteger)length 
{ 
    ++_sendBufferCount; 
    _sendBufferBuffer = buffer; 
    _sendBufferLength = length; 
} 

@end 

테스트 코드는 대신 보낸 사람의 TestingSender을 만듭니다.