Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果结果是使用NSLog记录,如何创建单元测试_Ios_Objective C_Unit Testing_Nslog - Fatal编程技术网

Ios 如果结果是使用NSLog记录,如何创建单元测试

Ios 如果结果是使用NSLog记录,如何创建单元测试,ios,objective-c,unit-testing,nslog,Ios,Objective C,Unit Testing,Nslog,我想创建检查一个特定情况的单元测试。这种情况的结果是使用系统功能NSLog进行日志记录 <2014-02-19 03:05:11> Warning bla-bla-bla. Please, check you code. Warning bla bla bla。请检查您的密码。 我搜索了很多,但没有找到一个合适的解决方案。是否有可能通过观察捕获日志记录操作,或者以某种方式检索mb Xcode控制台内容 任何建议都会有帮助 编辑好吧,我发现有人误解了我想测试的内容。库想要警告使用它

我想创建检查一个特定情况的单元测试。这种情况的结果是使用系统功能
NSLog
进行日志记录

<2014-02-19 03:05:11> Warning bla-bla-bla. Please, check you code.
Warning bla bla bla。请检查您的密码。
我搜索了很多,但没有找到一个合适的解决方案。是否有可能通过观察捕获日志记录操作,或者以某种方式检索mb Xcode控制台内容

任何建议都会有帮助


编辑好吧,我发现有人误解了我想测试的内容。库想要警告使用它的开发人员一些错误的输入。它将继续处理它们,并返回结果(mb不正确的结果)。但在某些处理点,我检查值(不是初始值)并记录警告消息,然后继续处理。即使我封装了这个逻辑,我也不想让这个功能公开

您没有显示任何代码,但听起来您想测试一个字符串的值,而该字符串在运行时只出现在日志中。您可以轻松地隔离此方法以允许单元测试工作

因此,假设当前代码是:

- (void)someMethod {
    NSString *string = @"Generated using some process";
    NSLog(@"String is %@", string);
    [self useString:string];
}
这可以更改为:

- (NSString *)generateString {
    NSString *string = @"Generated using some process";
    return string;
}

- (void)someMethod {
    NSString *string = [self generateString];
    NSLog(@"String is %@", string);
    [self useString:string];
}

然后,您的单元测试将重点放在
generateString
上,而不是
someMethod
您不显示任何代码,但听起来您想测试一个字符串的值,该字符串在运行时只出现在日志中。您可以轻松地隔离此方法以允许单元测试工作

因此,假设当前代码是:

- (void)someMethod {
    NSString *string = @"Generated using some process";
    NSLog(@"String is %@", string);
    [self useString:string];
}
这可以更改为:

- (NSString *)generateString {
    NSString *string = @"Generated using some process";
    return string;
}

- (void)someMethod {
    NSString *string = [self generateString];
    NSLog(@"String is %@", string);
    [self useString:string];
}

然后,您的单元测试将重点放在
generateString
上,而不是
someMethod
我也有同样的情况,所以您可以做的是 1.将日志定向到txt文件

+ (void)recordLog{
    NSArray *allPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [allPaths objectAtIndex:0];
    pathForLog = [documentsDirectory stringByAppendingPathComponent:@"FWTestLog.txt"];
    NSLog(@"path = %@",pathForLog);

    stderrSave = dup(STDERR_FILENO);
    freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
}
2.在txt文件中搜索字符串“bla-bla-bla”模式,并使用XCTTest测试是否找到该字符串

3.关闭文件并将其删除,以便其他nslog返回控制台

+ (void)closeLog{
    fflush(stderr);
    dup2(stderrSave,STDERR_FILENO);
    close(stderrSave);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error = nil;
    [fileManager removeItemAtPath:pathForLog error:&error];
}

我将它包装在我的自定义测试类中,这样我就可以将它与其他标准的xctest一起使用 1.将日志定向到txt文件

+ (void)recordLog{
    NSArray *allPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [allPaths objectAtIndex:0];
    pathForLog = [documentsDirectory stringByAppendingPathComponent:@"FWTestLog.txt"];
    NSLog(@"path = %@",pathForLog);

    stderrSave = dup(STDERR_FILENO);
    freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
}
2.在txt文件中搜索字符串“bla-bla-bla”模式,并使用XCTTest测试是否找到该字符串

3.关闭文件并将其删除,以便其他nslog返回控制台

+ (void)closeLog{
    fflush(stderr);
    dup2(stderrSave,STDERR_FILENO);
    close(stderrSave);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error = nil;
    [fileManager removeItemAtPath:pathForLog error:&error];
}

我将其包装在自定义测试类中,以便与其他标准XCTTest一起使用。这里是对Swift的转换,我还添加了搜索功能:

classyourtestclass:XCTestCase{
//此处使用的类属性,因为只有一个特定的输出被放入日志文件中,所以其余的日志应保留在控制台中,例如用于构建服务器日志。
var stderrSave:Int32=0
var logFilePath:String{
得到{
让documentsPath=NSSearchPathForDirectoriesInDomains(.documentDirectory、.userDomainMask,true)
返回文档SPATH!+“/FWTestLog.txt”
}
}
//将在您希望将所有日志重定向到logile之前调用
func惊人的记录(){
self.stderrSave=dup(STDERR\u文件号)
freopen(self.logFilePath.cString(使用:.ascii)、“a+”和stderr)
}
//当您要停止将所有日志重定向到单独的文件时,将调用
func closeLogging(){
fflush(stderr);
dup2(标准存储,标准文件号);
关闭(stdersave);
try?FileManager.default.removietem(atPath:self.logFilePath)
}
//搜索相应的字符串
func recordLog(记录的字符串:string)->Bool{
let content=try?字符串(contentsOfFile:self.logFilePath)
返回(内容?.hasSuffix(字符串+“\n”))!
}
func testExample(){
赛尔夫
var isRecorded=self.recordLog(记录:“您记录的字符串”)

xctasertfalse(isRecorded,“这里是对Swift的转换,我还添加了搜索功能:

classyourtestclass:XCTestCase{
//此处使用的类属性,因为只有一个特定的输出被放入日志文件中,所以其余的日志应保留在控制台中,例如用于构建服务器日志。
var stderrSave:Int32=0
var logFilePath:String{
得到{
让documentsPath=NSSearchPathForDirectoriesInDomains(.documentDirectory、.userDomainMask,true)
返回文档SPATH!+“/FWTestLog.txt”
}
}
//将在您希望将所有日志重定向到logile之前调用
func惊人的记录(){
self.stderrSave=dup(STDERR\u文件号)
freopen(self.logFilePath.cString(使用:.ascii)、“a+”和stderr)
}
//当您要停止将所有日志重定向到单独的文件时,将调用
func closeLogging(){
fflush(stderr);
dup2(标准存储,标准文件号);
关闭(stdersave);
try?FileManager.default.removietem(atPath:self.logFilePath)
}
//搜索相应的字符串
func recordLog(记录的字符串:string)->Bool{
let content=try?字符串(contentsOfFile:self.logFilePath)
返回(内容?.hasSuffix(字符串+“\n”))!
}
func testExample(){
赛尔夫
var isRecorded=self.recordLog(记录:“您记录的字符串”)

xctasertfalse(已记录,“更改您的代码使其更易于测试…@Immi,我查看了这篇文章,看不出它有什么帮助me@Wain,使此代码段更易于测试与增加此功能的开销有关。作为库开发人员,我希望避免更改代码以使其更易于测试…@Immi,我查看了这篇文章,不知道它有什么帮助me@Wa在中,使此代码段更易于测试与增加此功能的开销有关。作为库开发人员,我希望避免itI。我不发布任何代码,因为我希望看到不使用它的方法=)无论如何,在这种情况下,我希望保持此方法的私有性,因为它不会给用户(另一个开发人员)带来任何好处