在应用程序启动后启动依赖于目标(如KIF和某些单元测试)的测试,所以不,你不能让beforeEach在你的AppDelegate之前没有一些可怕的hackery.
我不知道你是如何进行依赖注入的,所以这就是我们如何做/一些一般策略.
理想情况下,KIF测试不应该在代码级别进行模拟
这是因为KIF是UIAutomation的替代品,主要用于UI级别的功能/功能测试.您并不是真的想要更改应用程序代码.模拟最好使用OHHTTPStubs等框架用于网络或OCMock用于对象,并且仅限于单元测试时效果最佳.
如何在"真实"应用程序中模拟网络请求
这里最好的方法是使用像OHHTTPStubs或AMY服务器(由制作KIF的同一个人制作)或Nocilla来返回存根响应.这样您就可以让您的应用代码完全运行.例如,OHHTTPStubs使用NSURLProtocol拦截您的请求,因此从应用程序的角度来看,它几乎和外出网络一样好.
我真的想嘲笑那些对象
如果你真的真的想要用不同的对象模拟依赖注入的对象,那么有一些越来越少的hacky选项.
1)使用真正的DI框架(或构建自己的框架),允许修补依赖项.我用过台风,这是合理的.这里的标准想法是使用控制反转对您有利.由于您从应用程序上下文而不是直接获取所有对象,因此调整应用程序上下文抽象层要容易得多.Typhoon甚至还有关于此主题的维基页面:https://github.com/appsquickly/Typhoon/wiki/Integration-Testing
2)跟踪您正在注入的对象的源,并希望模拟并在源处更改它.这不是最优雅的,无论如何你都是在破解DI框架,但也许你没有足够的时间或复杂性来切换到值得它的DI框架.
3)哈克一直到顶级.让测试AppDelegate从您的普通AppDelegate中进行子类化并在KIF测试期间使用它(当然还有它存根或模拟出你想要的对象).这不灵活但是,也许你只想要一个测试用例或者其他东西:
int main(int argc, char *argv[])
{
int returnValue;
@autoreleasepool {
BOOL inIntegrationTests = NSClassFromString(@"KIFTestCase") != nil;
if (inIntegrationTests) {
returnValue = UIApplicationMain(argc, argv, nil, @"AppDelegateForTest");
}
else {
returnValue = UIApplicationMain(argc, argv, nil, @"AppDelegate");
}
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不是一个简单的"我在哪里提出这个方法"的问题.
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |