测试用例中的 NSData 比较

NSData comparison in test case

概览:

有一个函数 f1 returns NSData

有没有一种方法可以编写测试用例来测试 returns NSData 的函数?

如何创建变量 expectedOutput(请参阅下面的代码)?

示例:

@interface Car : NSObject

- (NSData*) f1;

@end

@implementation Car

- (NSData*) f1 {

    NSData *someData = [[NSData alloc] init]; //This is just an example, the real code has some logic to build the NSData

    return someData;
}

@end

测试用例:

- (void) test {
    Car *c1;

    NSData *actualOutput = [c1 f1];
    NSData *expectedOutput = ??? //How can I build this NSData ?

    XCTAssertEqualObjects(actualOutput, expectedOutput);
}

expectedOutput 的构建方法取决于 NSData 的内容。它应该基于 f1.
的含义 如果您不知道该类型的数据应该生成 f1,您可以检查返回的 NSData 的长度和 class(如果您知道以字节为单位的长度)。
如果您知道 f1 将一些字符串编码为数据,您可以生成一个目标字符串并将生成的字符串与从返回的数据创建的字符串进行比较。
如果你知道应该生成这个函数的字节序列(例如你在其他语言上有相同的函数,或者有标准具字节),你可以将字节从磁盘加载到 NSData 并将其与 actualOutput 进行比较。

步骤

  1. expectedOutput (NSData) 写入文件(一次)
  2. 在测试用例中读取文件并填充expectedOutput
  3. 比较 expectedOutputactualOutput

第 1 步:

    - (void) writeExpectedDataToFile {}

        //Write expected data to file (to be done only once)
        NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *docsDir = [dirPaths objectAtIndex:0];
        NSString *databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"expected.txt"]];

        [data writeToFile:databasePath atomically:YES];
    }

第 2 步:

    - (void) test {
        Car *c1;

        NSData *actualOutput = [c1 f1];

        //Reading from file
        NSBundle* bundle = [NSBundle bundleForClass:[self class]];
        NSURL* fileName1 = [bundle URLForResource:@"expected" withExtension:@"txt"];
        NSData *expectedData = [NSData dataWithContentsOfFile:[fileName1.path stringByExpandingTildeInPath]];

        XCTAssertEqualObjects(actualOutput, expectedOutput);
}