我想检查正在运行的代码是否为单位案例或不为结果执行不同的代码,例如:
if ( unit test case is running )
{
do something
}
else
{
do other thing
}
对此有任何想法吗?
我想检查正在运行的代码是否为单位案例或不为结果执行不同的代码,例如:
if ( unit test case is running )
{
do something
}
else
{
do other thing
}
对此有任何想法吗?
这是一种不好的方法,您应该尝试通过 Mock ojects 或其他机制来模拟您试图通过此 statemetn 避免的逻辑部分。
现在对于您的问题,您可以使用isUnittest
您在测试设置和 Teardown 中设置的 oolean 变量,但正如我所说,我不建议您这样做。
不要UIAlertView
直接发消息。相反,使用依赖注入,例如,像这样的属性
@property (strong, nonatomic) Class alertViewClass;
然后你的代码创建一个警报就可以了
UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…];
在您的测试代码中,注入一个不同的类。我使用https://github.com/jonreid/JMRTestTools来指定JMRMockAlertView
. 然后我可以使用JMRMockAlertViewVerifier
. (事实上,这使得警报的测试驱动开发成为可能。)
编辑:这些天,我使用https://github.com/jonreid/ViewControllerPresentationSpy
另一种方法是让类具有通过静态方法控制的可定制行为,并让测试用例在其静态加载方法中调用该方法。
我在使用故事板和通过 oauth 进行身份验证的外部 restful 服务时遇到了类似的问题。应用程序委托将检查 appdelegate:didFinishLaunchingWithOptions 中是否存在有效的 oauth 令牌,如果没有,则以编程方式触发 segue 进行 oauth 登录。但这在测试用例中是不可取的。为了解决这个问题,我在应用程序委托中创建了一个静态方法来禁用登录屏幕。这是我的应用程序委托中的代码:
static Boolean showLoginScreen = TRUE ;
+ (void) disableLoginScreen
{
showLoginScreen = FALSE ;
NSLog(@"disabled login screen") ;
}
测试用例有它的加载方法来执行以下操作:
// disable login screen for the test case
+ (void) load {
NSLog( @"now disabling login screen" ) ;
[XYZAppDelegate disableLoginScreen];
}
这是因为在初始化应用程序之前加载了测试用例类。当然,您必须在应用程序委托中检查此标志的值以触发/不触发登录 segue。我尝试但拒绝的其他替代方案如下:
在测试目标上创建预处理器定义。但是编译器只编译带有这个标志的测试用例文件,而不是应用程序源。见http://www.innovaaptor.com/blog/2013/09/02/xcode-preprocessor-macros-for-test-code.html
使用测试用例的静态初始化方法调用禁用方法。在测试用例运行时,应用程序在加载测试用例类之前启动。有关详细信息,请参阅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;
}
我认为这比其他答案更干净、更容易。