와 목표 - C에서 호출합니다. 이 배열의 내용은 address
, data
및 commandType
에 따라 다릅니다. 내 테스트에서 올바른 배열이 빌드되어 -sendBuffer:length:
에 전달되었는지 확인하려고합니다. OCMock은 uint8_t *
인수에 대한 기대치를 설정하지 않습니다. OCMockito/OCHamcrest는 (아직) 부분 모의를 사용하지 않을 것입니다. 내 테스트 사례 클래스에서 메서드를 호출하고 그 메서드 호출에 대한 기대치를 설정하는 방법으로 -sendBuffer:length:
메서드를 시도해 보았습니다. 그러나 swizzled 메서드가 호출 될 때 self
은 테스트 케이스 대신 테스트중인 클래스를 가리 킵니다. 테스트중인 클래스의 버퍼를 유지 한 다음 테스트에서이 버퍼의 내용을 확인할 수는 있지만 테스트를 지원하기 위해 프로덕션 코드에 무언가를 추가하는 것은 싫어합니다. 누구든지이 동작을 테스트하는 방법에 대한 더 나은 제안이 있습니까?확인 방법은 내가 테스트를 해요 내가 클래스에서 두 가지 방법이 원시적 배열/포인터 인수
답변
이것은 논증의 여지가 있지만 포괄적 인 단위 테스트의 이점은 코드 복잡성의 증가를 보완하고 보람있는 트레이드 오프를 제공합니다. 당신이 설명하는 경우, 나는 생산 클래스에 버퍼를 추가하여 전송 된 마지막 바이트 시퀀스를 검색하여 단위 테스트에서 주장 할 수 있다고 생각합니다. 완벽하게 잘 접근 할 수 있습니다.
대용량 메시지가 프로덕션 코드로 전송되면 우발적 인 불필요한 메모리 오버 헤드를 방지하기 위해 개인적으로 버퍼가 유지 관리되는지 여부를 제어하는 부울 속성을 추가 할 수 있습니다. 단위 테스트 설정은 물론이 속성을 설정하지만 응용 프로그램/프레임 워크 생산 코드는 그렇지 않습니다. 다시 말하지만, 핵심은 추가 된 코드를 그렇게 간단하게 만들어서 분명히 맞도록하는 것입니다. :-)
프로덕션 클래스가 노출하는 인터페이스에 대해 엄격하거나 엄격하게 지정해야하는 경우 버퍼 유지 관리 코드를 조건부 컴파일에 종속되게 만들 수도 있습니다. 나는 개인적으로 이전 접근법을 선호하지만, 각자 자신에게만 접근한다.
모의 프레임을 만들 필요가 없습니다. 도전, 내가 받아, 당신은 실제로 -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을 만듭니다.