检查运行的代码是否是unit testing用例
我想检查运行的代码是否是unit testing的情况,或者是否对结果执行不同的代码,例如:
if ( unit test case is running ) { do something } else { do other thing }
任何想法呢?
这是一个不好的方法,你应该尝试通过Mock ojects或其他机制来模拟你正试图避免的逻辑部分。
现在你的问题你可以使用一个像isUnittest
这样的testing设置和isUnittest
设置的types的variables,如果你喜欢,我不build议你这样做。
不要直接向UIAlertView
发送消息。 相反,使用dependency injection,例如,一个属性
@property (strong, nonatomic) Class alertViewClass;
然后你的代码来创build一个警报可以做的
UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…];
在你的testing代码中,注入一个不同的类。 我使用https://github.com/jonreid/JMRTestTools来指定JMRMockAlertView
。 然后,我可以使用JMRMockAlertViewVerifier
testing警报调用。 (事实上,这使得testing驱动开发警报。)
另一种方法是让类具有通过静态方法控制的可定制行为,并使testing用例在其静态加载方法中调用该方法。
我有一个类似的问题,使用故事板和一个外部宁静服务通过oauth进行身份validation。 应用程序委托会检查appdelegate中是否存在有效的oauth标记:didFinishLaunchingWithOptions,如果不是,则编程方式触发segue执行oauthlogin。 但是这在testing用例中是不可取的。 为了解决这个问题,我在应用程序委托中创build了一个静态方法来禁用login屏幕。 这是我的应用程序委托中的代码:
static Boolean showLoginScreen = TRUE ; + (void) disableLoginScreen { showLoginScreen = FALSE ; NSLog(@"disabled login screen") ; }
testing用例的负载方法如下:
// disable login screen for the test case + (void) load { NSLog( @"now disabling login screen" ) ; [XYZAppDelegate disableLoginScreen]; }
这是因为在初始化应用程序之前加载了testing用例类。 当然,您必须检查应用程序委托内的这个标志的值,以触发/不触发login继续。 我尝试但拒绝的其他select如下:
-
在testing目标上创build一个预处理器定义。 但是,编译器只是用这个标志编译testing用例文件,而不是应用程序源文件。 见http://www.innovaptor.com/blog/2013/09/02/xcode-preprocessor-macros-for-test-code.html
-
使用testing用例的静态初始化方法调用disable方法。 在testing用例运行时,应用程序在加载testing用例类之前启动。 有关详细信息,请参阅http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/ 。
这似乎适用于我(iOS 8,Xcode 6):
- (BOOL) isRunningTest { return NSClassFromString(@"XCTestCase") != nil; }
我认为这比其他答案更清洁,更容易。