在此示例中
$.ajax(document.referrer)
.done(function(html) {
var urls = $("<div/>").html(html)
.find("a")
.map(function(i, e) { return $(this).attr("href"); }
});
如何模拟class A
{
public:
A();
~A();
virtual void func1();
virtual void func2();
protected:
virtual void func3();
private:
// How do I mock this
NetworkClass b;
}
对象?
我认为仅使用google-mock宏是不可能的。
您必须重新定义标识符NetworkClass b
来实际表示NetworkClass
,然后(出于测试目的)将原始NetworkClassMock
重命名为NetworkClass
之类的东西。>
但这仍然不能帮助您出于测试目的访问私有成员NetworkClass_Orig
。
答案 0 :(得分:1)
您不能照原样嘲笑b
。您将需要使用Dependency Injection。
首先,您需要指定基类(或接口),并从NetworkClass
派生NetworkClassMock
和INetworkClass
。然后,您可以传递原始指针(最好使用std::unique_ptr之类的智能指针)或对class A
的引用。此输入可以是您的实际实现NetworkClass
或您的模拟NetworkClassMock
。
请参见以下示例:
#include <iostream>
class INetworkClass
{
public:
virtual void doSomething() = 0;
};
class NetworkClass : public INetworkClass
{
public:
void doSomething() override {std::cout << "Real class" << std::endl;} ;
};
class NetworkClassMock : public INetworkClass
{
public:
void doSomething() override {std::cout << "Mock class" << std::endl;};
};
class A
{
public:
A(INetworkClass& b) : b(b) {};
~A() {};
void func1() {b.doSomething();};
private:
// How do I mock this
INetworkClass& b;
};
int main(){
NetworkClass real_class;
NetworkClassMock mock_class;
A a1(real_class);
A a2(mock_class);
a1.func1();
a2.func1();
return 0;
}
如果您只想访问您的私人成员,例如要在执行一些测试后读取它的价值,您应该重新设计代码。从班级外部访问私人成员不是一个好的设计。如果仍要执行此操作,则可以检查this answer(为C#而不是C ++编写,但仍可用)。
P.S。要使用override关键字,您将需要在C ++ 11支持下进行编译。