有谁知道如何为NSLog
功能编写单元测试?
我正在为我的所有框架组件编写单元测试,测试日志记录是否在各种场景中发生对我来说非常重要。
例如:允许框架用户启用或禁用日志记录的配置。如果他们启用了日志记录,则很重要,但这很难在单元测试中验证。
有人可以帮帮我吗?
有谁知道如何为NSLog
功能编写单元测试?
我正在为我的所有框架组件编写单元测试,测试日志记录是否在各种场景中发生对我来说非常重要。
例如:允许框架用户启用或禁用日志记录的配置。如果他们启用了日志记录,则很重要,但这很难在单元测试中验证。
有人可以帮帮我吗?
简单的测试方法是,执行 NSLog,然后检查控制台日志。和代码来检查
NSMutableArray *consoleLog = [NSMutableArray array];
aslclient client = asl_open(NULL, NULL, ASL_OPT_STDERR);
aslmsg query = asl_new(ASL_TYPE_QUERY);
asl_set_query(query, ASL_KEY_MSG, NULL, ASL_QUERY_OP_NOT_EQUAL);
aslresponse response = asl_search(client, query);
asl_free(query);
aslmsg message;
while((message = aslresponse_next(response)))
{
const char *msg = asl_get(message, ASL_KEY_MSG);
[consoleLog addObject:[NSString stringWithFormat:@"%s" , msg]];
}
NSLog(@"Console: %@", consoleLog);
我建议为 NSLog 编写一个包装器并彻底测试该包装器。示例:您有一个URLStringValidator
用于验证 url 字符串的类。
如果传入一个空,您想记录一条消息String
。您将制定一个协议来代表您的记录器。
protocol Logging {
func log(_ message: String, args: CVarArg...)
}
struct Logger: Logging {
func log(_ message: String, args: CVarArg...) {
NSLog(message, args)
}
}
class URLValidator {
let logger: Logging
init(logger: Logging = Logger()) {
self.logger = logger
}
func isEmpty(urlString: String) -> Bool {
guard !urlString.isEmpty else {
logger.log("Don't pass an empty string")
return false
}
return true
}
}
现在您可以使用 fake 而不是Logger
. 我还认为您需要一个额外的测试来断言 logger 具有正确类型的具体实现。前任:
class FakeLogger: Logging {
var capturedMessage: String?
func log(_ message: String, args: CVarArg...) {
capturedMessage = message
}
}
class URLValidatorTests {
func testLoggerDefaults() {
XCTAssertTrue(URLValidator().logger is Logger,
"A url validator should use the correct concrete class for its logger")
}
func testValidatingEmptyString() {
let fakeLogger = FakeLogger()
let validator = URLValidator(logger: fakeLogger)
validator.isEmpty(urlString: "")
XCTAssertNil(fakeLogger.capturedMessage)
validator.isEmpty(urlString: "Not Empty")
XCTAssertEqual(fakeLogger.capturedMessage, "Don't pass an empty string")
}
}
现在您可以测试您的逻辑(您关心并应该测试的部分)并NSLog
作为配置细节保留。您可以轻松使用os_log
或写入自定义文件。