シングルトンのモックはトリッキーです。いくつかの実行時マジックでそれを行うことができます。Matt Gallagher の invokeSupersequent マクロの助けを借りて行うことができます。基本的に、モックを設定した場合にのみ、オーバーライドcurrentDevice
してモックを返すカテゴリをテスト ケースに追加します。セットアップは次のとおりです。
#import "NSObject+SupersequentImplementation.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
@implementation UIDevice (UnitTests)
+(id)currentDevice {
if ([BaseTestCase mockDevice]) {
return [BaseTestCase mockDevice];
}
return invokeSupersequentNoArgs();
}
@end
#pragma clang diagnostic pop
static id mockDevice = nil;
+(id)mockDevice {
return mockDevice;
}
+(id)createMockDevice {
mockDevice = [OCMockObject mockForClass:[UIDevice class]];
return mockDevice;
}
+(id)createNiceMockDevice {
mockDevice = [OCMockObject niceMockForClass:[UIDevice class]];
return mockDevice;
}
-(void)tearDown {
mockDevice = nil;
[super tearDown];
}
次に、テストで:
-(void)testShouldDoSomethingOnIpad {
id mockDevice = [BaseTestCase createNiceMockDevice];
[[[mockDevice stub] andReturnValue:OCMOCK_VALUE(UIUserInterfaceIdiomPad)] userInterfaceIdiom];
// do something iPad-specific
[mockDevice verify];
}
しばらく前に、このアプローチのより詳細な記事を書きました。