2013-01-15 28 views

回答

3

这是一种糟糕的方法,您应该尝试模拟您正试图通过Mock ojects或其他机制来避免此状态的逻辑部分。

现在你的问题你可以使用一个像isUnittest这样的设置在测试设置和拆解上的类型变量,如果你喜欢,我不建议你这么做。

+0

感谢您的线索,但事情是我想弹出一个警告只有单元测试用例运行,我不想在源代码中添加任何布尔变量。我只想知道哪个目标运行有任何方法来检查它? –

+0

不是你使用unittest的框架提供这样一个标志吗? – CloudyMarble

+0

不,但我最终使用了布尔标志,正如你所说的。谢谢 –

1

请勿直接发送信息UIAlertView。相反,使用依赖注入,例如财产一样

@property (strong, nonatomic) Class alertViewClass; 

那么你的代码来创建一个警报可以做

UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…]; 

在你的测试代码,注入不同的类。我使用https://github.com/jonreid/JMRTestTools来指定JMRMockAlertView。然后,我可以使用JMRMockAlertViewVerifier来测试警报呼叫。 (实际上,这使得警报的测试驱动开发成为可能。)

1

另一种方法是让该类具有通过静态方法控制的可自定义行为,并让测试用例在其静态装入方法中调用该方法。

我有一个类似的问题,使用故事板和外部宁静的服务通过oauth进行身份验证。应用程序委托会检查appdelegate中是否存在有效的oauth标记:didFinishLaunchingWithOptions,如果没有,则编程方式触发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]; 
} 

这工作,因为申请被初始化之前测试用例类加载。当然,您必须在应用程序委托中检查此标志的值以触发/不触发登录继续。我尝试但拒绝的其他替代方案如下:

1

这似乎为我工作(的iOS 8时,Xcode 6):

- (BOOL) isRunningTest { 
    return NSClassFromString(@"XCTestCase") != nil; 
} 

我觉得这是比其他答案清洁和更容易。

+0

只有将所有测试用例写入一个类名XCTestCase时,这才是一个好主意。但是我意识到我要实现的目标是一个非常糟糕的主意!感谢您的努力... –

+1

确实,'XCTestCase'是iOS测试框架的一部分,因此无论如何它都可以工作(至少,如果您没有在应用中导入框架,这并没有多大意义)。 – manueGE

+1

作为一个方面说明,即使对象不是'nil',将一个对象转换为'BOOL'也可以产生'NO'。 'BOOL'将使用指针的最后几位,可以是这样的:'00000000',它将被注册为'NO'。请参阅本文中的“投射到BOOL”:https://www.mikeash.com/pyblog/friday-qa-2012-12-14-objective-c-pitfalls.html – MaxGabriel

相关问题