Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从SenTestCase派生类调用NSInvocation不可行?_Iphone_Objective C_Ocmock - Fatal编程技术网

Iphone 从SenTestCase派生类调用NSInvocation不可行?

Iphone 从SenTestCase派生类调用NSInvocation不可行?,iphone,objective-c,ocmock,Iphone,Objective C,Ocmock,NSInvocation类是否不打算通过单元测试调用(对于iPhone) 我的目的是一般地调用类的方法,因为该方法有两个以上的参数,所以我不能使用[myTestClass performSelector:withObject:withObject] 相反,我正在尝试使用NSInvocation,但一旦我尝试从NSInvocation类实例化,就会出现生成错误: 2009-12-31 11:12:16.380 otest[2562:903]*********即将打电话 非侵入 /开发者/工具/运行

NSInvocation类是否不打算通过单元测试调用(对于iPhone)

我的目的是一般地调用类的方法,因为该方法有两个以上的参数,所以我不能使用
[myTestClass performSelector:withObject:withObject]

相反,我正在尝试使用NSInvocation,但一旦我尝试从NSInvocation类实例化,就会出现生成错误:

2009-12-31 11:12:16.380 otest[2562:903]*********即将打电话 非侵入 /开发者/工具/运行平台单元测试。包括: 第415行:2562总线错误
“${THIN_TEST_RIG}” “${其他测试标志}” “${TEST\u BUNDLE\u PATH}” /开发者/工具/运行平台单元测试。包括:451: 错误:测试台 “/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/ iPhoneSimulator3.1.2.sdk/Developer/usr/bin/otest' 异常退出,代码为138(it) 可能已经坠毁了)

我的测试班:

@implementation MyExampleClass
-(void)methodWithArgs:(NSString *)aValue 
          secondParam:(NSString *)aSecond 
          thirdParam:(NSString *)aThird
{
    NSLog(@"methodWithArgs reached");
}
-(void)methodBlank
{
    NSLog(@"methodBlank reached");
}
-(void)isTesting
{
    NSLog(@"isTesting reached");
}
@end
我的单元测试:

@interface MyClassTests : SenTestCase
{
}    
@end

@implementation MyClassTests

- (void)testNSInvocation
{   
    Class probeClass = NSClassFromString(@"MyExampleClass");
    if (probeClass != Nil) {        
      SEL selector = NSSelectorFromString(@"isTesting");

      NSMethodSignature *sig = [probeClass methodSignatureForSelector:selector];

      // the following line causes the error
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];  

      // this variation also fails
      NSMethodSignature *sig2 = [probeClass 
      methodSignatureForSelector:@selector(methodWithArgs:secondParam:thirdParam:)];

      NSInvocation *inv2 = [NSInvocation invocationWithMethodSignature:sig2];   
    }   
}
@end

在运行时调用具有2个以上参数的方法的方法是什么?我是否必须更改方法的签名,使其只有2个参数?这是单元测试框架的一个限制吗?

n在测试线束中,隔离应该可以正常工作。SenTest一点也不在乎

2562总线错误

这表示进程已崩溃。很难


在调试器中运行测试线束并获取堆栈跟踪。首先,我建议您进行测试,以确保
sig
为非零。

您是否使用了正确的选择器?您已经指出测试将在MyExampleClass中调用一个方法ISTest,不带任何参数。。。和bbum注释一样,选择器似乎不正确,因此sig为nil,然后调用创建终止。您至少应该检查这种情况,如果是这样,就不要调用。

上述失败的原因确实是由于选择器不正确

我需要指定:“
实例methodSignatureForSelector
”,而不是使用“
方法签名ForSelector”

因为这些方法都是实例方法


但是,您的两个答案都有助于追踪问题。

我添加了代码来显示我的测试类的外观——我认为我正确地调用了选择器,并尝试了第二个选择器,该选择器引用了具有多个参数的方法。它们都会产生错误(当我尝试另一个时,其中一个会被注释掉)