有没有办法强制[super init]在逻辑测试中失败?

时间:2011-08-24 21:21:32

标签: objective-c

我想编写一个逻辑测试来测试[super init]失败时的情况。

我有一个这样的init方法:

- (id)init
{
    if ((self = [super init]) != nil)
    {
        // init my members
    }
    return self;
}

有谁知道如何让[super init]返回nil来测试这个案例?在这种情况下,“super”是NSObject,我目前正在使用SenTestKit进行逻辑测试。

4 个答案:

答案 0 :(得分:2)

您可以插入未通过init方法的中间父类:

@interface InitFailTest : NSObject
{
}

- (id)init;
@end

@implementation InitFailTest
- (id)init
{
    if (gFailSuperInitTest)
        return nil;
    else
        return [super init];
}
@end

@interface MyClass : InitFailTest  // instead of NSObject
...

但这似乎有点重量级。如果您的父类是NSObject,那么老实说,如果它的init方法失败,我不会太担心测试。如果您的父类是其他内容并且它已记录失败条件,那么您当然应该测试它们。

答案 1 :(得分:1)

你可以,但它会非常复杂。您需要在init(谷歌“方法混合”)上调动NSObject。真的没有理由这样做。 NSObject init失败的唯一方法是,如果你完全没有内存,而且在桌面和移动应用程序中这是一个如此模糊的情况,那么对它的测试不值得创建它的开销。你甚至不能为它编写一个ObjC错误处理程序,因为你完全没有内存而ObjC在没有分配一点内存的情况下几乎无法运行。

如果您真的想测试这种情况,最好使用从nil返回init的测试类,并检查系统的其余部分是否正常工作。但这是,而且应该是一个我不会追求的非常模糊的案例。

答案 2 :(得分:1)

您可以添加#define语句,例如#define INIT_FAIL_TESTING。然后,在要测试的类的父级中(假设您有权访问它),将以下内容放在其init方法的开头:

#if INIT_FAIL_TESTING
return nil
#endif

或者,在您实际想要测试的课程中,执行以下操作:

- (id)init
{
#if INIT_FAIL_TESTING
    self = nil;
#else
    self = [super init];
#endif

    if (self == nil) {
    //...
    }
    return self;
}

第二个选项可能更好,因为它不要求你有权访问父类,并且你应该能够假设父进程在其init方法中所做的任何事情都没有发生。您只是在测试是否收到了有效的父级实例,而您通过将self设置为nil来明确不这样做。

答案 3 :(得分:0)

如果您所做的只是测试[super init]nil的案例,那么您是否只能将其替换为nil,看看会发生什么?