【发布时间】:2012-09-20 09:56:18
【问题描述】:
我正在试验 TDD 和 C。我想按照 TDD 方法编写一个简单的 malloc 包装器。我正在尝试遵循 Bob Martin 的 TDD 三大定律
- 不要编写生产代码,除非是为了使失败的单元测试通过。
- 不要编写超过足以导致失败的单元测试,构建失败就是失败。
- 不要编写超过足以通过一个失败的单元测试的生产代码。
这是我到目前为止的代码:
J_STATUS MemAlloc(long Size, void **OutPtr) {
J_STATUS ReturnStatus;
void *Ptr;
Ptr = NULL;
if (Size >= 0) {
Ptr = malloc(Size);
*OutPtr = Ptr;
ReturnStatus = SUCCESS;
//TODO controllare malloc error
} else {
ReturnStatus = ERROR;
}
return ReturnStatus;
}
这些是我的测试(我正在使用 Unity 测试框架):
#include "../unity/unity.h"
#include "../src/jMem.h"
#include "stdlib.h"
static int *ptr;
static J_STATUS Result;
static long Size;
static long Count;
void setUp() {
ptr = NULL;
Size = 10;
Count = 5;
}
void tearDown() {
if (ptr != NULL) {
free(ptr);
}
}
void test_MemAllocShouldAllocateMemoryAndReturnSuccess(void) {
Result = MemAlloc(Size, (void **) &ptr);
TEST_ASSERT_EQUAL(SUCCESS, Result);
TEST_ASSERT_NOT_NULL(ptr);
}
void test_MemAllocShouldReturnErrorIfSizeIsNegative(void) {
Size = -4;
Result = MemAlloc(Size, (void **) &ptr);
TEST_ASSERT_EQUAL(ERROR, Result);
}
现在如何为失败的 malloc 编写测试?我知道我可以链接不同版本的 malloc 或者我可以编写一个宏来使 malloc 失败,但这应该只适用于这个测试,而在另一个我想使用真正的 malloc。
有什么想法吗? 谢谢
【问题讨论】:
-
为 malloc 引入一个接缝。在 c#/java 中,这是 MemoryManager.Allocate(size) 中的接口。如果插入调用类,则 MemoryManager 的实现。这允许您交换可以控制的兼容实现以模拟分配失败..例如在 MockMemoryManager 中引发 OutOfMemoryException。在 C 中,我认为完成此操作的一种方法是使用函数指针而不是接口。相同的概念。