gpt4 book ai didi

ios - 使用 KIF : beforeEach is called after my view controller is loaded? 进行功能测试

转载 作者:行者123 更新时间:2023-11-28 20:18:56 25 4
gpt4 key购买 nike

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

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

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

是否有可能在 AppDelegate 加载 Root View Controller 之前设置依赖关系以便一切设置正确?

最佳答案

依赖于目标的测试(如 KIF 和某些单元测试)在应用程序启动后启动,所以不,如果没有一些可怕的 hackery,你不能让 beforeEach 在你的 AppDelegate 之前。

我不知道你是如何进行依赖注入(inject)的,所以我们是这样做的/一些通用策略。

理想情况下,KIF 测试不应在代码级别进行模拟

这是因为 KIF 是 UIAutomation 的替代品,主要用于 UI 级别的特性/功能测试。您真的不想对您的应用程序代码进行如此大的更改。模拟最好使用诸如用于网络的 OHHTTPStubs 或用于对象的 OCMock 等框架来实现,并且这些框架在仅限于单元测试时效果最佳。

如何在“真实”应用中模拟网络请求

此处最好的方法是使用 OHHTTPStubs 或 AMY 服务器(由制作 KIF 的同一个人制作)或 Nocilla 之类的东西来返回 stub 响应。这样您就可以让您的应用程序代码完全运行。例如,OHHTTPStubs 使用 NSURLProtocol 来拦截您的请求,因此从应用程序的角度来看,它几乎与外出网络一样好。

我真的很想模拟那些对象

如果你真的真的真的想用不同的对象模拟依赖注入(inject)对象,那么有几个或多或少的 hacky 选项。

1) 使用允许修补依赖项的真正的 DI 框架(或构建您自己的框架)。我用过 Typhoon,它是合理的。这里的标准思想是利用控制反转来发挥你的优势。由于您是从应用程序上下文而不是直接获取所有对象,因此调整应用程序上下文抽象层要容易得多。台风甚至有一个关于这个主题的维基页面:https://github.com/appsquickly/Typhoon/wiki/Integration-Testing

2) 跟踪您正在注入(inject)的对象的来源,并希望模拟并在源头更改它。这不是最优雅的,无论如何你都在破解一个 DI 框架,但也许你没有足够的时间或复杂性来值得切换到 DI 框架。

3) 一路破解到顶层。有一个测试 AppDelegate,它是普通 AppDelegate 的子类,并在 KIF 测试期间使用它(当然还有它 stub 或模拟你想要的对象)。这不灵活,但同样,也许您只想要一个测试用例或其他东西:

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;
}

不幸的是,最终这不是一个简单的“我应该把这个方法放在哪里”的问题。

关于ios - 使用 KIF : beforeEach is called after my view controller is loaded? 进行功能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com