Tag: unit testing

Objective C – 在私有方法中unit testing核心function?

我在许多情况下,我的核心逻辑是在私人方法。 你将如何去unit testing,是否有任何一种编译时操作忽略未知/私有方法的编译错误? 我知道对于代码的第二部分,我可以使用performSelector,但这是一个合理的解决scheme? 例如: [[self.objectMock expect] privateMethod]; or [self.object callPrivateMethodsToExpectSomeOtherBehaviour] 编辑: 下面是一个例子来说明为什么我觉得我需要testing一些私有方法。 这些testing不合理吗? 我怎么会testing那个调用clear实际上是做它应该做的? – (void)clear { self.orderNumber = nil; [self.items removeAllObjects]; // Clear the rest of fields } – (void)testClearShouldRemoveOrderNumber { Order *order = [[Order alloc] init]; OCMockObject *orderPartialMock = [OCmockObject partialMockForObject:order]; [[orderPartialMock.items expect] setOrderNumber:nil]; [orderPartialMock clear]; [orderPartialMock verify]; } – (void)testClearShouldRemoveItems { […]

加载XCTest时出错,找不到合适的图像。

我最近更新了我的Xcode,并开始有这个错误。 2014-11-03 15:03:54.222 App[13141:60b] Error loading /private/var/mobile/Applications/677127BD-5230-4D5F-B70E-AF728439D34B/tmp/AppTests.xctest/AppTests: dlopen(/private/var/mobile/Applications/677127BD-5230-4D5F-B70E-AF728439D34B/tmp/AppTests.xctest/AppTests, 262): no suitable image found. Did find: /private/var/mobile/Applications/677127BD-5230-4D5F-B70E-AF728439D34B/tmp/AppTests.xctest/AppTests: code signature invalid for '/private/var/mobile/Applications/677127BD-5230-4D5F-B70E-AF728439D34B/tmp/AppTests.xctest/AppTests' DevToolsBundleInjection: Error loading bundle '/private/var/mobile/Applications/677127BD-5230-4D5F-B70E-AF728439D34B/tmp/AppTests.xctest' 我照常进行Googlesearch。 但我还没有find任何解决scheme。 来源我看了,试图解决我的问题是, http://marcschwieterman.com/blog/testing-in-the-sandbox/ 什么时候发生? 它只显示这个错误,如果我在设备上运行unitesting。 在模拟器上,它按预期工作。 从正常目标运行应用程序不会显示此错误。 运行Uni Test应用程序时出现错误时不会崩溃。 它只是无法加载xctests。 任何人有类似的问题? 并设法解决它?

使用OCMock版本2.1.1testing类的方法

我正在尝试检查是否使用OCMock调用类方法。 我从OCMock网站和其他答案收集到的新的OCMock版本(2.1)增加了对桩类方法的支持。 我正在尝试做同样的事情: DetailViewController: +(BOOL)getBoolVal { return YES; } testing用例: -(void) testClassMethod { id detailMock = [OCMockObject mockForClass:[DetailViewController class]]; [[[detailMock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] getBoolVal:nil]; } testing正在运行,并且也成功,但即使从DetailViewController getBoolVal方法返回NO而不是YES,它也会成功。 在保持该方法的断点时,testing执行不会停止指示该方法未被调用。 那么我如何检查一个类的方法呢?

使用URLRequestConvertible在unit testing中链接错误

我有一个奇怪的问题写一个简单的unit testing(Xcode 7.2)一个非常简单的function,确保参数被添加到一个URL: func appendToken(token: String, toRequest request: URLRequestConvertible) throws -> URLRequestConvertible { var error: NSError? let modifiedRequest: NSMutableURLRequest (modifiedRequest, error) = Alamofire.ParameterEncoding.URL.encode(request, parameters: ["token": self.token]) guard error == nil else { // TODO: handle error throw error! } return modifiedRequest } unit testing是这样的: func testTokenAddition() { let token = "ABCD12345" let client = MyClass(token: […]

如何用共同的逻辑testing2种方法?

假设我有两个公共方法: func didSelect(data: Data) { // do something self.view.showText(textForData(data)) } func didDismiss(data: Data) { if data.isSomething { self.view.showText(textForData(data)) } … } private func textForData(data: Data): String { var text: String if data.distance == nil { text = "…" } else if data.distance < 1000 { text = "\(data.distance) m" } else { text = "\(data.distance […]

为什么我应该使用单独的testing主机来运行XCTests,我应该怎么做?

我曾经问过一个与XCTests有关的问题 。 在其中一个答案中,我被告知,在运行unit testing时(至less在iOS开发中),使用单独的testing主机(除主应用程序之外)是常见的做法。 我试图find一些关于它的消息来源,但我不能 我明白,这可能是一个最好的做法,所以我真的很想了解它。 有人可以向我解释为什么它很重要,我从中得到什么好处,我应该怎么做呢? 链接到一些文章解释这个问题将不胜感激。 PS我明白,我需要testing的特殊环境(假内存数据库,模拟networking层等),但直到现在我设法实现它没有一个单独的testing主机,只使用我的主要应用程序,如Xcodebuild议默认。 但我相信可能有更好的办法。 而且我知道Xcode暗示的默认值并不总是那么好。

无法将应用程序委托转换为testing中的应用程序委托

我正在Swift中进行unit testing,并且遇到了一个问题。 每次我运行testing,我得到的错误: Could not cast value of type 'app.AppDelegate' to 'app_Tests.AppDelegate' 我确定AppDelegate没有从testing包中检查,视图控制器不能再访问应用程序委托。 有没有人有这个问题的解决scheme。 提前致谢!

调用时XCTest失败

我有一些代码,在某些时候调用[NSBundle mainBundle] ,主要是读取/设置首选项。 当我unit testing的方法,testing失败,因为testing的mainBundle不包含该文件。 这是一个已知的问题 ,苹果不会因为他们认为它不是一个bug而修复 : 他们答复的要点是XCTest通过返回它自己的主包而不是testing目标包来正常工作。 以前我们的代码是在NSBundle的+mainBundle类方法上使用类别重写来解决这个问题。 但是这是很危险的,因为覆盖类别中现有方法的行为是未定义的 。 如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(甚至是超类)上的另一个类中的方法相同,则行为是不确定的运行。 实际上Xcode提醒你: 类正在实现一个方法,也将由其主要类实现 那么,解决这个问题的正确方法是什么呢?

链接器错误,当unit testing:ld:非法的文本重定位到cstring中…从_av_image_check_size在… / libavutil.a(imgutils.o)

在Xcode 4.3.2中,构build一个iPad应用程序(其中包含来自ffmpeg发行版的libavutil.a ,它构build并正确运行,但是当我尝试运行unit testing(Cmd-U)时,出现以下链接器错误: ld:非法将文本重定位到/myPath/libavutil.a(imgutils.o)中的cstring,从/avPath/libavutil.a(imgutils.o)中的_av_image_check_size中,用于体系结构armv7 clang:错误:链接器命令失败,退出代码1(使用-v看到调用) 这是在设备上(我们目前无法在模拟器中运行它,因为我们没有包含所有库的fat二进制文件)。 为什么在运行unit testing时,它会正常构build和正常运行,而不是链接?

更改部署目标后,不能再将应用程序模块导入unit testing

对于在我的swiftunit testing中对主要应用程序目标的公共类进行unit testing,我必须在我的testing中导入我的主应用程序模块,如下所示: #import MyAppModuleName 这工作得很好,直到我将我的部署目标从7.0更改为8.4。 现在构build和运行我的应用程序仍然完美,但运行unit testing停止工作。 编译器抱怨上面的导入语句: Swift Compiler Error: Module file's minimum deployment target is iOS8.4 v8.4 我不知道为什么。 我忘了在其他地方更改部署目标吗? 我的工作区(Xcode 6.4)包含我自己的项目和一个Pods项目(由cocoapods自动创build)。 我在我的应用程序和我的testing中使用Swift和Objective-C。 这是我做了更详细的: 1)将我的项目,主要目标以及工作空间中的Pods项目以及所有Pod目标的部署目标从7.0更改为8.4。 2)清理构build文件夹(Shift + Alt + Cmd + K)并重新启动Xcode。 3)Cmd + U – >错误 将主应用程序的部署目标更改回7.0时,再次正常工作。 任何想法,这个问题来自哪里?