如何在测试框架中测试NSLog(默认iOS)

时间:2012-11-26 15:36:24

标签: ios unit-testing

有谁知道如何编写NSLog功能的单元测试? 我正在为我的所有框架组件编写单元测试,测试日志是否发生在各种场景中对我来说非常重要。

Ex:允许框架用户启用或禁用日志记录的配置。如果启用日志记录就很重要,但在单元测试中很难验证。

有人可以帮帮我吗?

2 个答案:

答案 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或写入自定义文件。