Iphone OCMock测试失败-未调用预期的方法

Iphone OCMock测试失败-未调用预期的方法,iphone,ios,objective-c,unit-testing,ocmock,Iphone,Ios,Objective C,Unit Testing,Ocmock,在考试班 -(void)testMyTest { MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]]; id master = [OCMockObject mockForClass:[DetailViewController class]]; [[master expect] getString

在考试班

-(void)testMyTest
{
MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]];
id master = [OCMockObject mockForClass:[DetailViewController class]];
 [[master expect] getStringVal:@"PARAM"];
[masterVC doSomething];
 [master verify];
}
详细信息查看控制器

-(NSString*)getStringVal:(NSString*)param
{
NSString *returnParam = [NSString stringWithFormat:@"%@-String",param];
return returnParam;
}
主视图控制器中

  -(void)doSomething
 {
DetailViewController *detail = [[DetailViewController alloc]init];

[detail getStringVal:@"PARAM"];
NSString * returnVal = [detail getStringVal:@"PARAM2"];
NSLog(@"returnVal %@",returnVal);
NSLog(@"doSomething");
}
当我运行测试时,我得到以下错误:

剂量 未知。m:0:错误:-[IOS5示例测试testMyTest]:OCMockObject[DetailViewController]:未调用预期的方法:getStringVal:@“PARAM”


看起来好像没有调用该方法。但是,如果我在方法中设置了断点,它将停止并显示该行已由应用程序执行,并且我也正确地获取了日志。

getStringVal方法在真实对象上被调用,因为您已在doSomething方法中分配了DetailViewController的新实例,它不会在模拟对象上被调用

相反,您可以对剂量测定法进行一些修改

-(void)doSomething:(DetailViewController *)detail
{
     [detail getStringVal:@"PARAM"];
     NSString * returnVal = [detail getStringVal:@"PARAM2"];
     NSLog(@"returnVal %@",returnVal);
     NSLog(@"doSomething");
}
在您的测试用例中

-(void)testMyTest
{
    MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]];
    id master = [OCMockObject mockForClass:[DetailViewController class]];
    [[master expect] getStringVal:@"PARAM"];
    [[master expect] getStringVal:@"PARAM2"];
    [masterVC doSomething:master];
    [master verify];
}

这应该是可行的。

getStringVal方法在实际对象上被调用,因为您在doSomething方法中分配了DetailViewController的新实例,所以它不会在模拟对象上被调用

相反,您可以对剂量测定法进行一些修改

-(void)doSomething:(DetailViewController *)detail
{
     [detail getStringVal:@"PARAM"];
     NSString * returnVal = [detail getStringVal:@"PARAM2"];
     NSLog(@"returnVal %@",returnVal);
     NSLog(@"doSomething");
}
在您的测试用例中

-(void)testMyTest
{
    MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]];
    id master = [OCMockObject mockForClass:[DetailViewController class]];
    [[master expect] getStringVal:@"PARAM"];
    [[master expect] getStringVal:@"PARAM2"];
    [masterVC doSomething:master];
    [master verify];
}

这应该可以工作。

这是因为您的主模拟对象正在使用自己的详细信息视图控制器而不是您的模拟详细信息视图控制器吗

-(void)testMyTest
{
MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]];
id detailVC = [OCMockObject mockForClass:[DetailViewController class]];

// This is the missing line. If you don't have such a property use setValue:forKey:
masterVC.detailViewController = detailVC

 [[master expect] getStringVal:@"PARAM"];
[masterVC doSomething];
 [master verify];
}


-(void)doSomething
{
    // This is the offending line: you should be using the mock object not a real one.
    DetailViewController *detail = [[DetailViewController alloc]init];
    [detail getStringVal:@"PARAM"];
    NSString * returnVal = [detail getStringVal:@"PARAM2"];
    NSLog(@"returnVal %@",returnVal);
    NSLog(@"doSomething");
}

这可能是因为您的主模拟对象正在使用自己的详细信息视图控制器而不是您的模拟详细信息视图控制器

-(void)testMyTest
{
MasterViewController* masterVC = [[MasterViewController alloc]init];//[OCMockObject mockForClass:[MasterViewController class]];
id detailVC = [OCMockObject mockForClass:[DetailViewController class]];

// This is the missing line. If you don't have such a property use setValue:forKey:
masterVC.detailViewController = detailVC

 [[master expect] getStringVal:@"PARAM"];
[masterVC doSomething];
 [master verify];
}


-(void)doSomething
{
    // This is the offending line: you should be using the mock object not a real one.
    DetailViewController *detail = [[DetailViewController alloc]init];
    [detail getStringVal:@"PARAM"];
    NSString * returnVal = [detail getStringVal:@"PARAM2"];
    NSLog(@"returnVal %@",returnVal);
    NSLog(@"doSomething");
}

不工作。现在我正在获取OCMockObject[DetailViewController]:调用了意外的方法:getStringVal:@“PARAM2”您添加了[[master expect]getStringVal:@“PARAM2”];在您的测试用例中,您正在调用NSString*returnVal=[detail getStringVal:@“PARAM2]”;在doSomething方法中,所以您需要在测试用例中为该方法添加一个期望值。如何实现for void方法。计算单利的方法。但它不会返回任何值。如何检查计算功能?让我们不要工作。现在我正在获取OCMockObject[DetailViewController]:调用了意外的方法:getStringVal:@“PARAM2”您添加了[[master expect]getStringVal:@“PARAM2”];在您的测试用例中,您正在调用NSString*returnVal=[detail getStringVal:@“PARAM2]”;在doSomething方法中,所以您需要在测试用例中为该方法添加一个期望值。如何实现for void方法。计算单利的方法。但它不会返回任何值。如何检查计算功能?让我们来看看