使用在初始化程序中创建的模拟对象

时间:2016-08-17 09:10:20

标签: ios objective-c unit-testing ocmock

我有一个Worker类,标题为:

@interface Worker : NSObject {
  // instance variable `task`
  MyTask *task;
}
@end

初始化方法是这样的:

@implementation Worker

-(id)initWithName:(NSString*)name{
  self = [super init];
  if (self) {
    // I need to use mocked task in my test case
    task = [[MyTask alloc] init];
    ...
    ...
  }
  return self
}

-(void)doWork{
  [task start];
}

我想对这个类进行单元测试,我正在使用OCMock库来进行模拟。我知道我可以通过以下方式创建一个模拟任务:

id mockedTask = OCMClassMock([MyTask class]);

但是,如何在测试用例中将此模拟任务注入我的 Worker 实例?我的意思是当我在测试类中创建一个Worker实例时,在初始化方法中创建任务:

-(void)setup{
  // how to inject the mocked task in to this workerUnderTest
  Worker *workerToTest = [[Worker alloc] initWithName:@"John"];
}

我需要在测试中使用模拟任务。我怎样才能实现它?

====我的测试用@Syashok的答案(它没有用)====

@interface WorkerTestCase : XCTestCase 
@end

@implementation WorkerTestCase{
  Worker *workerToTest;
  id mockedTask;
}
- (void)setUp {
  [super setUp];
  workerToTest = [[Worker alloc] initWithName:@"John"];

  mockedTask = OCMClassMock([MyTask class]);
  OCMStub([workerToTest task]).andReturn(mockedTask);
}

-(void) testDoWork{
 [workerToTest doWork];
 // it fails. method is not invoked!
 OCMVerify([mockedTask start]);
}
...
@end

如上所述,我的测试用例失败,它抱怨mockedTask对象没有调用。但是当我将断点设置为实际类实现时,调用[task start],表明mockedTask未成功注入。

1 个答案:

答案 0 :(得分:0)

您可以使用下面的OCMStub()注入它,您需要将task ivar声明为属性

@interface Worker : NSObject 
@property(nonatomic,strong)MyTask *task;
@end

//

id mockedTask = OCMClassMock([MyTask class]);
OCMStub([workerToTest task]).andReturn(mockedTask);

你的方法看起来像

-(void)setup{
  // how to inject the mocked task in to this workerUnderTest
  Worker *workerToTest = [[Worker alloc] initWithName:@"John"];

  id mockedTask = OCMClassMock([MyTask class]);
  OCMStub([workerToTest task]).andReturn(mockedTask);
}