私は、この状況ではファクトリメソッドを使いたいと思います。
@interface Destination(Factory)
+ (Destination *)destinationWithContext:(NavContext *)context;
@end
@implementation Destination(Factory)
+ (Destination *)destinationWithContext:(NavContext *)context
{
return [[Destination alloc] initWithContext:context];
}
@end
私はその後FakeClassを行います
#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に必要な今、あなたがに設定されている:
id destinationMock = [OCMock mockForClass:FakeDestination.class];
// do the swizzle
[FakeDestination setSharedInstance:destinationMock];
[[destinationMock expect] doSomething];
// Call your method
[destinationMock verify];
これはかなりの量のコーディングですが、非常に再利用可能です。
これは最も簡単な答えですが、簡単なテストをサポートするために、他の場所で実際には必要ではありません。私はどこかで妥協をする必要があると思います:) – Kevlar
別のDestinationオブジェクトを代用できるようにするには、何らかの方法でそれを渡す必要があります。これが私が知る最もクリーンな方法です。 –