gpt4 book ai didi

objective-c - 如何对 EXC_BAD_ACCESS 进行单元测试?

转载 作者:太空狗 更新时间:2023-10-30 03:26:40 25 4
gpt4 key购买 nike

我知道如何解决 EXC_BAD_ACCESS 问题,但我不确定如何对其进行单元测试。有没有办法在代码中捕获 EXC_BAD_ACCESS 而不是简单地崩溃?

这就是我问的原因:我编写了一个大量使用 block 的库,如下所示:

- (void)doSomething:(void (^)())myBlock;

在我的 doSomething: 实现中,我将最终运行该 block ,如下所示:

myBlock();

如果调用方为该 block 传递 nil,那么它将因 EXC_BAD_ACCESS 而崩溃,因此解决方案是检查该 block 是否存在,如下所示:

if (myBlock) {
myBlock();
}

这个 nil 检查很容易忘记,所以我想要一种方法来编写一个在崩溃发生时失败的单元测试。我想崩溃可以被认为是测试失败,但我认为对于其他试图运行测试的人来说,看到一个好的失败消息而不是崩溃会更好。有什么想法吗?

最佳答案

我认为您需要在子进程中运行测试;然后您可以让子进程崩溃,检查是否发生崩溃,如果发生崩溃,则完全不通过测试。

Peter Hosey's singleton test code 开始工作.

- (void) runTestInSubprocess:(SEL)testCmd {
pid_t pid = fork();
// The return value of fork is 0 in the child process, and it is
// the id of the child process in the parent process.
if (pid == 0) {
// Child process: run test
// isInSubprocess is an ivar of your test case class
isInSubprocess = YES;
[self performSelector:testCmd];
exit(0);
} else {
// Parent process: wait for child process to end, check
// its status
int status;
waitpid(pid, &status, /*options*/ 0);
// This was a crash; fail the test
STAssertFalse(WIFSIGNALED(status), @"Test %@ crashed due to signal %d", NSStringFromSelector(testCmd), WTERMSIG(status));
}
}

然后每个测试将在子进程中自行运行,如下所示:

- (void) testSomething {
if (!isInSubprocess) {
// Hand off this test's selector to be run in a subprocess
[self runTestInSubprocess:_cmd];
return;
}

// Put actual test code here
STAssertEquals(1, 1, @"Something wrong with the universe.");

}

您可能需要对此进行调整;我还没有测试过。

关于objective-c - 如何对 EXC_BAD_ACCESS 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com