如何在Objective-C中对方法内部的对象进行单元测试?

Kev*_*lar 6 unit-testing mocking objective-c ocmock

我想知道如何测试这个.我有一个方法,它接受一个参数,并根据该参数的一些属性创建另一个对象并对其进行操作.代码看起来像这样:

- (void) navigate:(NavContext *)context {
  Destination * dest = [[Destination alloc] initWithContext:context];
  if (context.isValid) {
    [dest doSomething];
  } else {
    // something else
  }
  [dest release];
}
Run Code Online (Sandbox Code Playgroud)

我要验证的是,如果context.isValid为true,则在dest上调用doSomething,但我不知道如何使用OCMock或任何其他传统测试方法测试它(或者甚至可能),因为该对象是完全在方法范围内创建.我这是错误的方式吗?

BJ *_*mer 5

您可以使用OCMock,但是您必须修改代码以获取Destination对象或使用可以首先替换模拟对象的单例对象.

最干净的方法可能是实现一个

-(void) navigate:(NavContext *)context destination:(Destination *)dest;
Run Code Online (Sandbox Code Playgroud)

方法.将执行更改-(void) navigate:(NavContext *)context为以下内容:

- (void) navigate:(NavContext *)context {
    Destination * dest = [[Destination alloc] initWithContext:context];
    [self navigate:context destination:dest];
    [dest release];
}
Run Code Online (Sandbox Code Playgroud)

这将允许您的测试直接使用额外参数调用该方法.(在其他语言中,您只需为destination参数提供默认值即可实现此目的,但Objective-C不支持默认参数.)