问题标签 [ocunit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
84 浏览

objective-c - 在我的 XCode 3 上安装 OCUnit 时出现问题

我正在使用 XCode 3 开发 MAC 和 iPhone 应用程序。因为我正在考虑对我的两个系统的结构进行重大修改,所以我首先需要进行单元测试。当我在互联网上浏览不同的可能性时,由于 XCode 的 Text Bundle 和 GTM(Google 工具箱 for MAC)都不起作用,我会尝试使用 OCUnit。我下载并安装了 OCUnit 的 Home 和 Root 包,但在我的 XCode IDE 上没有发现任何更改。

有人可以指导我安装它吗?

提前致谢。

0 投票
3 回答
556 浏览

objective-c - 在 ocUnit 中比较 NSArray

我是 ocUnit 的新手,我正在尝试将 2 个数组与 STAssertTrue 方法和 == 进行比较。

下面的测试只是向被测系统(sut)询问数组作为回报

然后在我的生产代码中,我只是返回相同的数组

然而,当测试运行时,我失败了。我应该如何比较这些对象以查看它们是否相同?

先感谢您

0 投票
2 回答
664 浏览

objective-c - 如何使用 ocUnit 为地理位置编写单元测试

我目前正在使用一个简单的对象,该对象将 lat 和 lng 值保存为 NSString。但是当我试图断言它们是平等的时,我用这种方法失败了

这是显示的错误

错误:-[LocationParseJsonTest testLocationParseJson] : '41.6756668' 应该等于 '41.6756668' 实际位置纬度是 41.6756668

因此,我尝试了使用“isEqual”的 AssertTrue 方法

我得到同样的错误

错误:-[LocationParseJsonTest testLocationParseJson]:“[expectedLocation.lat isEqual:actualLocation.lat]”应该为真。实际位置纬度为41.6756668

我应该如何比较 ocUnit 中的这些 NSString 值?这是位置 fyi 的 .h 文件

0 投票
1 回答
197 浏览

objective-c - OCUnit 的 UIImageView 错误

我正在使用 OCUnit 来测试我的应用程序,但是遇到了一些麻烦。当我尝试包含一个包含 UIImageView 类型的实例变量的类时,我收到以下错误:“UIImageView 之前的预期说明符限定符列表”

我的声明代码是:

我无法弄清楚是什么导致了这种情况,只有当我尝试使用我的测试目标构建我的应用程序时才会发生这种情况。

谢谢

0 投票
2 回答
6790 浏览

iphone - 如何为 iPhone 应用程序运行和调试单元测试

注意:现在设置单元测试要容易得多。本教程与 Xcode 版本 5 及更高版本无关。

我花了很长时间,但我终于设法使它适用于我的项目。为了创建“逻辑”测试,我遵循了 Apple 关于创建逻辑测试的指南。一旦您了解逻辑测试是在构建期间运行的,这就可以正常工作。

为了能够调试这些测试,需要创建一个自定义可执行文件来调用这些测试。Sean Miceli 在 Grokking Cocoa 博客上的文章提供了执行此操作的所有信息。然而,遵循它并没有立即取得成功,需要进行一些调整。

我将回顾 Sean 教程中介绍的主要步骤,提供了一些“傻瓜”大纲,我花了一些时间才弄清楚:

  1. 设置一个包含单元测试但不运行它们的目标
  2. 设置 otest 可执行文件以运行测试
  3. 设置 otest 环境变量,以便 otest 可以找到您的单元测试

以下是使用XCode 3.2.5执行的

XCode 4 的注意事项

在 XCode 4 中,可以直接调试您的单元测试。只需编写您的测试,将其作为测试之一添加到您的目标并在其中设置断点。就这样。还会有更多。

第 1 步 - 设置目标

  1. 复制位于项目 Targets 下的单元测试目标。这还将创建单元测试产品的副本(.octest 文件)。下图中“LogicTest”就是原来的目标。
  2. 将单元测试目标和单元测试产品(.octest 文件)重命名为相同的名称。下图中“LogicTestsDebug”是重复的目标。
  3. 删除新目标的 RunScript 阶段

两者的名称可以是任何名称,但我会避免使用空格。

在此处输入图像描述

第 2 步 - 设置 otest

这里最重要的一点是要获得正确的 otest,即适用于您当前 iOS 的那个,而不是默认的 Mac 版本。这在 Sean 的教程中有很好的描述。以下是一些帮助我正确设置的细节:

  1. 转到项目-> 新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名称和可执行文件路径。
  2. 键入任何您想要的名称。
  3. 将路径复制粘贴到您的 iOS otest 可执行文件。就我而言,这是 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest
  4. 按回车。这将带您进入可执行文件的配置页面。
  5. 此时唯一需要更改的是选择“路径类型:相对于当前 SDK”。不要输入路径,这是在步骤 3 中完成的。 在此处输入图像描述

第 3 步 - 设置 otest 参数和环境变量

otest 参数设置起来很简单……但这被证明是我最大的问题。我最初将我的逻辑测试目标命名为“LogicTests Debug”。使用这个名称和“LogicTests Debug.octest”(带引号)作为 otest 的参数,我一直让 otest 以退出代码 1 终止并且永远不会停止到我的代码中......

解决方案:目标名称中没有空格!

otest 的论据是:

  1. -SenTest Self(或全部或测试名称 - 在终端中键入 man otest 以获取列表)
  2. {LogicTestsDebug}.octest - 其中 {LogicTestsDebug} 需要替换为您的逻辑测试包名称。

以下是用于复制/粘贴的环境变量列表:

  • DYLD_ROOT_PATH: $SDKROOT
  • DYLD_FRAMEWORK_PATH: "${BUILD_PRODUCTS_DIR}: ${SDK_ROOT}:${DYLD_FRAMEWORK_PATH}"
  • IPHONE_SIMULATOR_ROOT:$SDKROOT
  • CFFIXED_USER_HOME: "${HOME}/Library/Application Support/iPhone Simulator/User"
  • DYLD_LIBRARY_PATH:${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
  • DYLD_NEW_LOCAL_SHARED_REGIONS:是
  • DYLD_NO_FIX_PREBINDING:是

请注意,我也尝试了 DYLD_FORCE_FLAT_NAMESPACE 但这只是让 otest 崩溃。

在此处输入图像描述

第 4 步 - 运行您的 otest 可执行文件

要运行您的 otest 可执行文件并开始调试您的测试,您需要:

  1. 将您的活动目标设置为您的单元测试目标(在我的情况下为 LogicTestsDebug)
  2. 将您的活动可执行文件设置为您的 otest 可执行文件

您可以构建和运行可执行文件并使用断点调试测试。

作为旁注,如果您在运行 otest 可执行文件时遇到问题,则可能与:

  1. 路径错误。最初我遇到了很多问题,因为我指向的是 mac otest。我在启动时一直崩溃,终止代码为 6。
  2. 错误的论点。直到我从包(.octest)名称中删除空间之前,我一直在退出代码为 1 的 otest 崩溃。
  3. 环境变量中的路径错误。肖恩教程有很多后续问题,可以让您深入了解其他人的尝试。我现在的套装似乎可以工作,所以我建议你从这个开始。

您可能会在控制台中收到一些消息,这可能会导致您认为环境变量有问题。您可能会注意到有关 CFPreferences 的消息。此消息不会阻止测试正常运行,因此如果您在运行 otest 时遇到问题,请不要关注它。

在此处输入图像描述

最后,一旦一切正常,您将能够在测试中的断点处停止。

在此处输入图像描述

最后一件事...

我在许多博客上读到集成 XCode SenTestKit 的主要限制是在构建应用程序时无法运行测试。事实证明,这实际上很容易管理。您只需将 Logic 测试包作为依赖项添加到您的应用程序项目中。这将确保在构建应用程序之前构建您的逻辑测试包,即运行所有测试。

为此,您可以将逻辑测试包拖放到应用程序目标上。

在此处输入图像描述

0 投票
3 回答
3507 浏览

xcode - 我是否必须做一些事情才能让 OCunit 测试使用 XCode 4 开箱即用地编译?

我今天刚刚安装了 XCode 4(使用 Apple mac 应用商店),我创建了一个新的 Mac OS 应用程序,并尝试切换到测试模式,并构建它为我生成的测试框架代码。它在这里失败了:

在 mytests.h 中:

错误是:

file://..mytests.h: error: Lexical or Preprocessor Issue: 'SenTestingKit/SenTestingKit.h' file not found

现在,当我从终端使用定位来查找 SenTestingKit.h 时,我注意到它存在于 /Developer-old/Library/Frameworks 文件夹下(XCode 4 安装程序将我的 /Developer 文件夹重命名为)。没有新的 /Developer/Library/Frameworks。而且我似乎在我的磁盘上找不到 SenTestingKit.framework,除了开发人员旧的。

这是怎么回事?XCode 4 似乎没有附带 SenTestingKit.framework。

更新:

此外,当我将旧的 SenTestingKit 框架从 XCode 3 复制到 /Developer/Library/Frameworks 时,它有点构建,但它并没有按我预期的方式工作。虚拟测试旨在失败,但是当我“运行测试”时,我只是打开了正常的可可应用程序文档窗口,并且没有迹象表明我的测试失败了(正如我打算做的那样)。

这很糟糕。我无法让单元测试失败。这对我来说不是通常的情况,你明白的。

0 投票
1 回答
275 浏览

objective-c - OCUnit链接问题问题

我想为我的课程编写单元测试,但我无法解决链接问题。在测试头中,我做了#import "myclass.h" 但是当我在测试实现文件中分配 myclass 对象时,它找不到符号。我已经添加了依赖项。

有任何想法吗?

0 投票
2 回答
570 浏览

objective-c - OCUnit 测试在未测试的类中给出错误

我编写了一个 OCUnit 测试,它在 Xcode 3.2 中运行良好,现在我在 Xcode 4 中遇到了问题。它测试了Xclass 中的单个静态函数A,它不调用任何类或函数(在库函数之外)。唯一需要调用的其他代码是静态构造函数,它初始化两个静态变量,但同样,这些是不调用任何其他类或类函数的硬编码值(数组)A

然而,我必须为它导入的所有类以及它们导入的所有类包含 .m、.mm 和 .c 文件等等,以解决_OBJC_CLASS_$_ClassB",引用自:错误。我不不记得必须在 Xcode 3 中执行任何操作,但是很好,没问题,我可以编译它。现在,我收到了源自 classB的错误+[B initialize]

为什么在没有以任何方式引用的类上调用静态构造函数?我该如何解决这个问题,理想情况下不改变我的课程来适应测试?

更新

为了进一步弄清楚发生了什么,我注释掉了我所有的测试用例#import "A.h",看看会发生什么。我添加了一个简单的单元测试:

尽管如此,我+[B initialize]的被调用并失败了。似乎 OCUnit 正在遍历我所有的类,并且+initialize在此过程中调用了它们的方法。这对我来说毫无意义 - 我怎样才能禁用这种行为?

这是调用我自己的代码之前的堆栈跟踪,以防万一:

0 投票
2 回答
4251 浏览

iphone - isKindOfClass 和 NSStringFromClass 不同意 UIApplicationDelegate

我正在为一个 iPhone 应用程序进行简单的 OCUnit 测试,只是想断言应用程序委托是我期望的类的一个实例。我没想到这个测试会很有用,但结果却揭示了我对 Objective C 的误解。

我首先得到对代表的引用。然后我记录返回的类名。就我而言,输出正确显示“应用程序委托的类名是 CalculatorAppDelegate”。

但是,下一行的断言失败了,我不明白为什么。

什么情况下会导致 NSStringFromClass() 返回正确的类名,而 isKindOfClass 返回 false?

0 投票
5 回答
33331 浏览

xcode - Xcode 4:从命令行(xcodebuild)运行测试?

我在 Xcode 4 中创建了一个全新的 iOS 项目,并包含了单元测试。默认应用程序有 2 个目标,主应用程序和单元测试包。使用“产品 > 测试”(Command-U)构建应用程序,构建单元测试包,启动 iOS 模拟器并运行测试。现在我希望能够从命令行做同样的事情。命令行工具(xcodebuild)没有“测试”操作,但似乎我应该能够直接构建单元测试包目标,因为它取决于应用程序本身。但是,运行:

给出以下消息:

这似乎是一个谎言,因为当我从 GUI 运行 Command-U 时,为我的单元测试包目标设置了测试主机。我以前看过关于逻辑测试和应用程序测试之间分离的帖子,但似乎 Xcode 4 消除了这种区别。有什么线索可以从命令行运行我的测试吗?