有谁知道如何编写NSLog
功能的单元测试?
我正在为我的所有框架组件编写单元测试,测试日志是否发生在各种场景中对我来说非常重要。
Ex:允许框架用户启用或禁用日志记录的配置。如果启用日志记录就很重要,但在单元测试中很难验证。
有人可以帮帮我吗?
答案 0 :(得分:1)
测试的简单方法是,执行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);
答案 1 :(得分:0)
我建议为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
}
}
现在您可以使用伪造而不是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
或写入自定义文件。