ios - 在单元测试中,验证使用参数 NSData 调用的函数(其中包含 NSString)

标签 ios objective-c unit-testing ocmock

我正在使用 OCMock v3做单元测试,我想测试一个名为 processInfo: 的非常简单的函数,它的实现如下所示:

@implementation MyService
-(void) processInfo{
  // get info file path
  NSString *infoFilePath = [self getInfoFile];
  // read info data from infoFile
  NSData *infoData = [[NSData alloc] initWithContentsOfFile:infoFilePath];

  // call another function to handle info data
  [self handleData:infoData];
}

-(void) handleData:(NSData*) infoData {
   ...
}

@end

如您所见,processInfo: 函数获取信息文件路径并读取数据,然后调用 handleData:(NSData*) 函数。非常简单的逻辑。

我尝试通过以下方式测试上述简单功能:

-(void) testProcessInfo{
  // create dummy info string
  NSString* dummyInfoStr = @"dummy info";
  // convert above NSString to NSData object
  NSData* dummyInfoData = [dummyInfoStr dataUsingEncoding:NSUTF8StringEncoding];

  // get the same info file path
  NSString* infoFilePath=[self getInfoFile];
  // write dummy info data to info file
  [data writeToFile:path options:NSDataWritingAtomic error:nil];

  // CALL function under test
  [myServicePartialMock processInfo];

  // I want to verify that handleData:(NSData*) has been invoked with a NSData argument which contains dummy string @"dummy info"
  // BUT it failed, even though the real implementation does it.
  // For some reason the dummyInfoData is not considered equal to the NSData used in real implementation, though they both contain string @"dummy info"
  OCMVerify([myServicePartialMock handleData:dummyInfoData]);
}

我想验证函数 handleData:(NSData*) 是使用包含虚拟字符串 @"dummy info"NSData 参数调用的>,但它失败了,即使真正的实现确实调用了handleData:(NSData*) 并从文件中读取了一个NSData 对象是否包含 @"dummy info"NSString

我的意思是看起来像 OCMVerify() 只是无法验证它,是因为 dummyInfoData 不是从文件中读取的吗?

我如何测试 handleData:(NSData*) 是使用包含虚拟字符串 @"dummy info"NSData 类型参数调用的> 然后呢?

最佳答案

NSData 旨在以多种格式封装来自各种来源的数据,因此具有相同行为的两个 NSData 对象实际上不太可能相同。在这种情况下,测试实例可能保留 NSString 的副本,而实现实例可能保留文件句柄,至少在使用它之前是这样。

在这种情况下,您可能希望在 OCMArg 上使用 checkWithBlock:,然后您就可以检查类和内容。您应该比较字符串而不是它们的 NSData 表示形式,因此请比较 dummyInfoStr[[NSString alloc] initWithData: infoData,encoding: NSUTF8StringEncoding]

关于ios - 在单元测试中,验证使用参数 NSData 调用的函数(其中包含 NSString),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713164/

相关文章:

objective-c - 当用户键入文本时为文本着色(iOS、Xcode)

ios - 在自定义范围 slider 上设置 alpha (NMRangerSlider)

c# - 模拟 SignInManager

c - HWUT 选择顺序

objective-c - NSInvocationOperation 等价 yield

python - 如何断言运算符 < 和 >= 未实现?

iOS - 在负坐标上绘制二维线条

ios - 为什么我的图标在 ios13 中有不同的行为

iphone - 如何阻止 UITable 在减速时覆盖我设置的内容偏移量?

ios - UIImageView setImage While UIScrollView is Scrolling