6
iOS 테스트를 위해 OCMock을 배우고 있습니다. "계급 모의"와 "부분 모의"의 차이점은 무엇이며 언제 다른 것을 사용해야합니까?iOS OCMock 부분 대 클래스 모의
iOS 테스트를 위해 OCMock을 배우고 있습니다. "계급 모의"와 "부분 모의"의 차이점은 무엇이며 언제 다른 것을 사용해야합니까?iOS OCMock 부분 대 클래스 모의
Class mocks
는 클래스 인스턴스의 순수 망신 시켰 개체를 만들 수 있습니다.
Partial mocks
클래스 인스턴스를 가져 가면 해당 메소드를 스텁 할 수 있습니다.
내가 이러한 클래스가 있다고 가정 :
@interface Foo : NSObject
- (void)doX;
@end
@implementation
- (void)doX
{
NSLog(@"X");
}
@end
@interface Bar : NSObject
- (void)doA:(Foo *)foo;
- (void)doB;
@end
@implementation Bar
- (void)doA:(Foo *)foo
{
NSLog(@"A");
[foo doX];
[self doB];
}
- (void)doB
{
NSLog(@"B");
}
@end
내가 테스트 바의 doA:
방법에 관심이 있어요. doX
을 Foo
개체로 호출 한 다음 자신의 doB
메서드를 호출 할 것으로 기대됩니다. Foo의 클래스 모의 (mock)와 Bar의 모의 부분을 사용하여 구현할 것입니다.
- (void)test_doA_shouldCall_doX_and_doB
{
id objectUnderTest = [OCMockObject partialMockForObject:[Bar new]];
id fooMock = [OCMockObject mockForClass:Foo.class];
[[fooMock expect] doX];
[[objectUnderTest expect] doB];
// Make the call
[objectUnderTest doA:fooMock];
[objectUnderTest verify];
[fooMock verify];
}
당신은 나의 부분 모의 날 나는 그것의 인스턴스 메소드의 다른 내부 전화를 조롱하면서 테스트하고 싶었 실제 메소드를 호출 할 수 있다고 여기를 참조하십시오. 그러나 Foo의 실제 기능이 필요 없기 때문에 클래스 모의를 사용했습니다.
정말 도움이되는 답변에 감사드립니다. 나는 두 가지 후속 질문을 가지고있다 : 1) 순수한 가짜가 당신에게 어떤 실제적인 방법을 부르도록 허용하지 않는다는 것이 사실인가? 2) 왜 Foo의 일부 모의 객체를 만들고 doX 메소드에서 기대를 할 수 없었습니까? – user1802143
1. 실제 모의 객체는 실제 객체에 의해지지되지 않지만, 기술적으로는 'andCall' 또는'andDo'를 사용하여 임의의 모의 메소드를 호출하도록 설정할 수 있습니다. 부분 모의에서는'andForwardToRealObject'를 수행 할 수 있습니다. 2. Foo의 일부 모의 객체를 만들 수 있습니다. 객체의 생성은 부작용이 있거나 테스트와 관련없는 작업을 포함하는 경우가 있습니다. 또한, 좋은 모의가 아닌 순수 모의는 예기치 않은 방법이 호출 될 때 불평 할 것이지만 부분 모의는 불리지 않을 것입니다. –