저는이 상황에서 공장 방법을 사용하고 싶습니다.
id destinationMock = [OCMock mockForClass:FakeDestination.class];
// do the swizzle
[FakeDestination setSharedInstance:destinationMock];
[[destinationMock expect] doSomething];
// Call your method
[destinationMock verify];
:이 설정되면
#import "Destination+Factory.h"
@interface FakeDestination : Destination
+ (id)sharedInstance;
+ (void)setSharedInstance:(id)sharedInstance;
// Note! Instance method!
- (Destination *)destinationWithContext:(NavContext *)context;
@end
@implementation FakeDestination
+ (id)sharedInstance
{
static id _sharedInstance = nil;
if (!_sharedInstance)
{
_sharedInstance = [[FakeDestination alloc] init];
}
return _sharedInstance;
}
+ (void)setSharedInstance:(id)sharedInstance
{
_sharedInstance = sharedInstance;
}
// Overrides
+ (Destination *)destinationWithContext:(NavContext *)context { [FakeDestination.sharedInstance destinationWithContext:context]; }
// Instance
- (Destination *)destinationWithContext:(NavContext *)context { return nil; }
@end
, 당신은 당신이 설정하고 지금 + (Destination *)destinationWithContext:(NavContext *)context;
에 대한 swizzle the class methods해야합니다
@interface Destination(Factory)
+ (Destination *)destinationWithContext:(NavContext *)context;
@end
@implementation Destination(Factory)
+ (Destination *)destinationWithContext:(NavContext *)context
{
return [[Destination alloc] initWithContext:context];
}
@end
나는 다음 FakeClass을
이것은 코딩의 상당한 양이지만 앞에 재사용 할 수 있습니다.
이것은 가장 쉬운 대답 인 것 같지만 대상 객체를 여러 범위에 살게하는 것이 조금 복잡해 보입니다. 쉬운 테스트를 지원하기 위해 다른 곳에서는 필요하지 않습니다. 나는 타협이 어딘가에 만들어 질 필요가 있다고 생각한다 : – Kevlar
그래; 별도의 Destination 객체를 대체 할 수 있기를 원한다면이 객체를 전달하는 몇 가지 방법이 있어야합니다. 이것이 내가 알고있는 가장 깨끗한 방법입니다. –