3

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

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

有人可以帮帮我吗?

4

2 回答 2

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);
于 2012-11-26T16:30:20.757 回答
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
    }
}

现在您可以使用 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或写入自定义文件。

于 2019-03-25T01:34:54.933 回答