gpt4 book ai didi

c++ - 模拟需要直接使用参数的函数的更好方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:07 25 4
gpt4 key购买 nike

我正在模拟一个 C 库 (..ughh),其中包含将“带指针的结构”作为参数的函数。我的目标是对这些指针指向的数据做一些期望。库函数立即使用它们的参数。即,在调用函数后,这些结构可以超出范围。

在代码中:

struct A
{
B* somePointer;
}

class ClassUnderTest
{
public:
ClassUnderTest()
{
B arbitraryStruct;
A structArg;
structArg.somePointer = &arbitraryStruct;
C_LibraryFunction(&A);
}
};

我的解决方案是通过定义一个 gtest 'action' 来保存参数。在这个 Action 中将 arbritraryStruct 保存到一些全局并做我期望的魔法。例如

B arbitraryStruct;
ACTION(captureB)
{
const A* a= arg0;
arbitraryStruct = *a->somePointer;
}

Test(TestClassUnderTest, testIt)
{
EXPECT_CALL(clibrary,
C_libraryFunction(testing::_)).WillOnce(DoAll(captureB());
ClassUnderTest classUnderTest;

EXPECT_EQ(bla, B.arbitraryStruct);
}

可以用,但感觉有点全面。我需要模拟该库的许多调用,其中一些包含复杂的结构。作为一个懒惰的程序员,感觉可以用更好的方法来完成。谁能想出更好的方法?

谢谢!

最佳答案

更好的方法是这样做。相反,您应该使用这些函数创建一个类,然后模拟该类。此类应尽可能简单,以防止可能的错误。

例如:

struct MyIface {
virtual ~MyIface(){}

virtual void Clog() = 0;
};

struct VeebleFitzer {
VeebleFitzer() : a( funcA() ) {
}
virtual void Clog() {
funcX( a );
funcY();
}

int a;
};

然后使用某种依赖注入(inject)将对象传递到需要的地方。


您始终可以创建功能测试,使用真实资源(包括“真实”而非模拟函数)来测试您的代码。

关于c++ - 模拟需要直接使用参数的函数的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46423154/

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