Ios 使用Ocmocito测试故事板的最佳方法

Ios 使用Ocmocito测试故事板的最佳方法,ios,objective-c,ocmockito,Ios,Objective C,Ocmockito,我正在尝试测试一个基于故事板的应用程序。该场景是一个导航控制器,其中包含一个视图控制器。测试是执行segue将视图控制器设置为目标控制器(push segue)。我正在使用Ocmocito,下面是我的测试: MyViewController *mockSut = mock([MyViewController class]); UINavigationController *nav = mock([UINavigationController class]); [given(mockSut.na

我正在尝试测试一个基于故事板的应用程序。该场景是一个导航控制器,其中包含一个视图控制器。测试是执行segue将视图控制器设置为目标控制器(push segue)。我正在使用Ocmocito,下面是我的测试:

MyViewController *mockSut = mock([MyViewController class]);
UINavigationController *nav = mock([UINavigationController class]);

[given(mockSut.navigationController) willReturn:nav];
[mockSut performSegueWithIdentifier:@"mySegue" sender:nil];

MKTArgumentCaptor *segueArgument = [[MKTArgumentCaptor alloc] init];
MKTArgumentCaptor *senderArgument = [[MKTArgumentCaptor alloc] init];

[verify(mockSut) prepareForSegue:[segueArgument capture] sender:[senderArgument capture]];
assertThat([[[segueArgument value] destinationViewController] class], equalTo([MyDestinationViewController class]));
但它抱怨没有调用
prepareforsgue:
方法


这里有什么问题?可能是
performsguewithidentifier:
以异步方式调用
prepareforsgue:

谁调用
-prepareforsgue:sender:
?是的。通过尝试测试,您正在测试UIKit,这是不必要的。在处理框架(即,调用您的东西)时,基本模式是:

  • 确保您正确调用了框架
  • 假设框架正确地回调。通过让您的测试直接调用框架将调用的方法,假装发生了这种情况

Juan,sut应该是真实的对象,而不是嘲笑。为mock编写测试并没有带来多少价值。因为它是mocks,所以它不调用真正的函数。如果要验证的参数不是mock对象,我不知道如何验证是否调用了prepareforsgue。