标签: ocunit

单元测试Xcode中的私有方法

我正在尝试玩具项目中的测试驱动开发.我可以让我的类的公共接口的测试工作(虽然我仍然在围栏,因为我正在编写比测试方法更多的测试代码).

我倾向于使用很多私有方法,因为我喜欢保持公共接口干净; 但是,我还是想对这些方法进行测试.

由于Cocoa是一种动态语言,我仍然可以调用这些私有方法,但是在我的测试中我得到警告,我的班级可能不会对这些方法做出反应(虽然它显然是这样).由于我喜欢在没有警告的情况下进行编译,因此我的问题是:

  1. 如何在Xcode中关闭这些警告?
  2. 我还能做些什么来关闭这些警告吗?
  3. 我在尝试"白盒子"测试时做错了什么?

tdd xcode cocoa objective-c ocunit

63
推荐指数
2
解决办法
1万
查看次数

构建单元测试目标时链接错误

我有一个带有常规目标和单元测试目标的XCode4/iOS项目.一切正常,除非我尝试#import我的测试类中的一个类并尝试使用它.如果我尝试构建单元测试目标,我会收到以下链接错误:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_FRRCategory", referenced from:
      objc-class-ref in CategoryTests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

在CategoryTests.m中,我以这种方式导入头文件:

#import "../todoro/FRRCategory.h"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

unit-testing linker-errors ocunit xcode4

52
推荐指数
3
解决办法
2万
查看次数

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

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

xcodebuild -target TestAppTests -sdk iphonesimulator4.3 -configuration Debug build
Run Code Online (Sandbox Code Playgroud)

给出以下消息:

/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:95: warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).
Run Code Online (Sandbox Code Playgroud)

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

xcode unit-testing xcodebuild ocunit xcode4

47
推荐指数
4
解决办法
3万
查看次数

使用OCUnit的单元测试示例

我真的很难理解单元测试.我确实理解TDD的重要性,但我读到的所有单元测试的例子似乎都非常简单和微不足道.例如,测试以确保设置属性或将内存分配给数组.为什么?如果我编码..alloc] init],我真的需要确保它有效吗?

我是开发新手,所以我肯定我在这里缺少一些东西,特别是围绕TDD的所有热潮.

我认为我的主要问题是我找不到任何实际的例子.这是一种setReminderId 似乎很适合测试的方法.什么是有用的单元测试看起来确保这是有效的?(使用OCUnit)

- (NSNumber *)setReminderId: (NSDictionary *)reminderData
{
    NSNumber *currentReminderId = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentReminderId"];
    if (currentReminderId) {
        // Increment the last reminderId
        currentReminderId = @(currentReminderId.intValue + 1);
    }
    else {
        // Set to 0 if it doesn't already exist
        currentReminderId = @0;
    }
    // Update currentReminderId to model
    [[NSUserDefaults standardUserDefaults] setObject:currentReminderId forKey:@"currentReminderId"];

    return currentReminderId;
}
Run Code Online (Sandbox Code Playgroud)

tdd unit-testing objective-c ocunit ios

39
推荐指数
1
解决办法
1万
查看次数

OCUnit和NSBundle

我根据"iPhone开发指南"创建了OCUnit测试.这是我要测试的类:

// myClass.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface myClass : NSObject {
    UIImage *image;
}
@property (readonly) UIImage *image;
- (id)initWithIndex:(NSUInteger)aIndex;
@end


// myClass.m
#import "myClass.m"

@implementation myClass

@synthesize image;

- (id)init {
    return [self initWithIndex:0];
}

- (id)initWithIndex:(NSUInteger)aIndex {
    if ((self = [super init])) {
        NSString *name = [[NSString alloc] initWithFormat:@"image_%i", aIndex];
        NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];
        image = [[UIImage alloc] initWithContentsOfFile:path];
        if (nil == image) {
            @throw [NSException exceptionWithName:@"imageNotFound"
                reason:[NSString stringWithFormat:@"Image (%@) with path \"%@\" for …
Run Code Online (Sandbox Code Playgroud)

resources unit-testing ocunit nsbundle

38
推荐指数
1
解决办法
9821
查看次数

XCTAssertEqual错误:("3")不等于("3")

NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@"1"];
[arr addObject:@"2"];
[arr addObject:@"3"];

// This statement is fine.
XCTAssertTrue(arr.count == 3, @"Wrong array size.");

// This assertion fails with an error: ((arr.count) equal to (3)) failed: ("3") is not equal to ("3")
XCTAssertEqual(arr.count, 3, @"Wrong array size.");
Run Code Online (Sandbox Code Playgroud)

我对XCTAssertEqual不了解什么?为什么最后一个断言失败了?

objective-c ocunit xctest

37
推荐指数
2
解决办法
2万
查看次数

如何从SenTestingKit/OCUnit迁移到XCTest?

我正在将我的项目从Xcode 4.6.3迁移到Xcode 5.0.2.该项目的单元测试是使用SenTestingKit/OCUnit开发的.现在当我在Xcode 5中运行测试时,我从RunUnitTests脚本中得到一个错误告诉我

RunUnitTests已过时.

可能相关的是Xcode 5发行说明中的​​这个注释:

SenTestingKit和OCUnit已弃用.使用迁移器移动到XCTest.

不幸的是,我还没有找到更多关于这个神秘的"迁移者"的信息.可能我的google-fu缺乏[再次],所以我的主要问题是:如何将单元测试从SenTestingKit/OCUnit迁移到新的XCTest(有或没有"迁移器")?

第二个问题,如果迁移是一项复杂的业务:是否有可能让Xcode 5运行仍基于SenTestingKit/OCUnit的单元测试?在所有这些仅仅被弃用之后,它们应该仍然存在并且功能性.

ocunit xcode5 xctest

35
推荐指数
2
解决办法
1万
查看次数

iPhone - 检索逻辑单元测试的资源

我一直在关注为iPhone编写单元测试的Apple文档,开箱即用,例程似乎不起作用.我不确定我理解单元测试将在何处获得对应用程序委托的引用.

我的依赖关系如下:My_Program_target - > UnitTesting_target - > UnitTests_bundle

以下代码片段断言失败.我对CPPUNIT非常熟悉,但是我很难理解它是如何跨越的.

- (void) testAppDelegate {

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
    STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate");

}
Run Code Online (Sandbox Code Playgroud)

另外:

我决定采用我的方法进行逻辑测试.我正在尝试读取XML文件,但我没有运气解析捆绑包,这将为我提供访问我的文件的路径.我已经尝试粘贴allBundles的路径输出,但是这条路径似乎也没有用.下面是我在测试中执行的内容(您可以看到我用来输出包的路径的调试语句):

NSLog(@"BundlePaths: %@", [NSBundle allBundles]);
   NSString * path = [[NSBundle bundleWithPath:@"$(TARGET_BUILD_DIR)"] pathForResource:@"SimpleTestList" ofType:@"plist"];
   STAssertNotNil(path, @"Bundle Location couldn't find the file specified");
Run Code Online (Sandbox Code Playgroud)

本质上,路径上的断言不成功,但我不确定要为路径或目录引入什么来引用我告诉我复制捆绑资源的unitTest捆绑包.调用[NSBundle mainBundle]也不起作用.

resources xcode unit-testing ocunit

28
推荐指数
1
解决办法
1万
查看次数

在不启动模拟器的情况下在Xcode 4中运行逻辑测试

我想在不启动模拟器的情况下使用OCUnit在Xcode 4中运行测试.请不要试图说服我,我正在进行单元测试错误或类似的事情.我喜欢用传统方式做TDD:在测试中为类编写API,然后让类通过测试.我将编写在模拟器中运行的端到端的单独测试.

如果没有办法做到这一点,那么请有人告诉我如何让测试工具不实例化整个应用程序?我的应用程序是事件驱动的,当它启动我的测试时,它会发送一堆事件.

tdd xcode objective-c ocunit ios-simulator

28
推荐指数
3
解决办法
8480
查看次数

Cocoa/Objective-C中内存管理的单元测试

您将如何编写单元测试 - 例如使用OCUnit - 以确保在Cocoa/Objective-C中正确释放/保留对象?

一个天真的方法是检查它的价值retainCount,但当然你永远不应该使用retainCount.您是否可以简单地检查对象的引用是否被赋值nil以指示它已被释放?另外,您对实际取消分配对象的时间有什么保证?

我希望只有几行代码的简洁解决方案,因为我可能会广泛使用它.实际上可能有两个答案:一个使用自动释放池,另一个不使用.

为了澄清,我不是在寻找一种全面测试我创建的每个对象的方法.全面地对任何行为进行单元测试是不可能的,更不用说内存管理了.但至少,最好检查已发布对象的行为以进行回归测试(并确保相同的与内存相关的错误不会发生两次).

关于答案

我接受了BJ Homer答案,因为我发现它是实现我想到的最简单,最简洁的方法,但需要注意的是,在XCode的生产版本中,提供自动引用计数的弱指针是不可用的.从2011年7月23日到4.2?)我也对这一点印象深刻

可以基于每个文件启用ARC; 它不要求整个项目使用它.您可以使用ARC编译单元测试并将主项目保留为手动保留释放,此测试仍然有效.

话虽如此,为了更详细地探讨Objective-C中单元测试内存管理所涉及的潜在问题,我强烈推荐Peter Hosey深入回应.

cocoa unit-testing memory-management objective-c ocunit

27
推荐指数
2
解决办法
2537
查看次数