使用KIF进行功能测试:在加载视图控制器后调用beforeEach?

Kon*_*iak 1 testing ios kif ocmockito specta

我有一个简单的(我猜)问题.

我想在我的应用程序中使用Specta和KIF进行功能测试.问题是我在我的View Controller的viewDidLoad方法中设置依赖,并且在我的规范的beforeEach方法中我注入假对象只是为了不打网络.

结果是错误的,因为在规范中的beforeEach方法之前调用了viewDidLoad.

是否有可能在AppDelegate加载根视图控制器之前设置依赖关系,以便正确设置所有内容?

pll*_*uke 5

在应用程序启动后启动依赖于目标(如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)

不幸的是,这不是一个简单的"我在哪里提出这个方法"的问题.