我想编写一个逻辑测试来测试[super init]失败时的情况。
我有一个这样的init方法:
- (id)init
{
if ((self = [super init]) != nil)
{
// init my members
}
return self;
}
有谁知道如何让[super init]返回nil来测试这个案例?在这种情况下,“super”是NSObject,我目前正在使用SenTestKit进行逻辑测试。
答案 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
,看看会发生什么?