我想检查运行代码是否是单元测试用例,或者不执行结果的不同代码,例如:
if ( unit test case is running )
{
do something
}
else
{
do other thing
}
对此有何看法?
答案 0 :(得分:3)
这是一个糟糕的方法,您应该尝试通过模拟对象或其他机制来模拟您试图通过此状态避免的逻辑部分。
现在问题你可以使用你在测试设置和拆解时设置的isUnittest
之类的oolean变量,我不建议你这样做。
答案 1 :(得分:1)
请勿直接向UIAlertView
发送消息。相反,使用依赖注入,例如,像
@property (strong, nonatomic) Class alertViewClass;
然后您的代码可以创建警报
UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…];
在测试代码中,注入另一个类。我使用https://github.com/jonreid/JMRTestTools来指定JMRMockAlertView
。然后,我可以使用JMRMockAlertViewVerifier
测试警报呼叫。 (事实上,这可以实现警报的测试驱动开发。)
答案 2 :(得分:1)
另一种方法是让类具有通过静态方法控制的可自定义行为,并在其静态加载方法中调用该方法的测试用例。
我有一个类似的问题,使用storyboard和外部的restful服务通过oauth进行身份验证。 app委托将检查appdelegate中是否存在有效的oauth令牌:didFinishLaunchingWithOptions,如果没有,则以编程方式触发segue进行oauth登录。但这在测试案例中是不可取的。为了解决这个问题,我在app delegate中创建了一个静态方法来禁用登录屏幕。这是我的app delegate中的代码:
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];
}
这很有效,因为在初始化应用程序之前加载了测试用例类。当然,您必须在app delegate中检查此标志的值以触发/不触发登录segue。我尝试但拒绝的其他替代方案如下:
在测试目标上创建预处理器定义。但是编译器只使用此标志编译测试用例文件,而不是应用程序源。请参阅http://www.innovaptor.com/blog/2013/09/02/xcode-preprocessor-macros-for-test-code.html
使用测试用例的静态初始化方法来调用disable方法。在测试用例运行时,应用程序在加载测试用例类之前启动。有关详细信息,请参阅http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/。
答案 3 :(得分:1)
这似乎对我有用(iOS 8,Xcode 6):
- (BOOL) isRunningTest {
return NSClassFromString(@"XCTestCase") != nil;
}
我认为这比其他答案更清晰,更容易。