c++ - 如何使这些类对单元测试更友好?

标签 c++ unit-testing

我有一个包含规则的二进制文件。我将这些规则解析为对象并针对它们扫描文件。我当前的对象模型是这样的:

struct TypeARule
{
    // rule internals
};

struct TypeBRule
{
    // rule internals
};

struct TypeCRule
{
    // rule internals
};

struct RuleDatabase
{
    vector<TypeARule> TypeA;
    vector<TypeBRule> TypeB;
    vector<TypeCRule> TypeC;
};

class RuleParser
{
public:
    bool ParseFile(const string& path, RuleDatabase& database)
    {
        // open file, read records from file, generate objects from records, add objects to database
    }
private:
    // misc helper methods
};

class RuleScanner
{
public:
    bool ScanFile(const string& path, const RuleDatabase& database)
    {
        if(ScanTypeA(path, database))
        {
            return true;
        }
        if(ScanTypeB(path, database))
        {
            return true;
        }
        if(ScanTypeC(path, database))
        {
            return true;
        }
        return false;
    }
private:
    bool ScanTypeA(const string& path, const RuleDatabase& database)
    {
        for(const auto& rule : database.TypeA)
        {
            if (rule matches path))
            {
                return true;
            }
        }
        return false;
    }
    bool ScanTypeB(const string& path, const RuleDatabase& database)
    {
        for(const auto& rule : database.TypeB)
        {
            if (rule matches path))
            {
                return true;
            }
        }
        return false;
    }
    bool ScanTypeC(const string& path, const RuleDatabase& database)
    {
        for(const auto& rule : database.TypeA)
        {
            if (rule matches path))
            {
                return true;
            }
        }
        return false;
    }
};

class Client
{
public:
    bool Initialize(const string& path)
    {
        RuleParser parser;
        return parser.ParseFile(path, m_database);
    }
    bool ScanFile(const string& path)
    {
        RuleScanner scanner;
        return scanner.ScanFile(path, m_database);
    }
    void Cleanup()
    {
        // cleanup m_database
    }
private:
    RuleDatabase m_database;
};

我了解依赖注入(inject)有助于测试 Client 类(通过将对模拟 RuleParserRuleScanner 对象的引用传递给其构造函数)。但是我需要做什么才能对 RuleParserRuleScanner 类进行单元测试?依赖注入(inject)在当前模型中不起作用,因为 RuleDatabase 是用于存储其他对象的哑对象。我最初的想法是修改RuleDatabase,隐藏它的数据成员,并提供公共(public)方法来操作它们,比如ParseTypeA()ParseTypeB()ScanTypeA()ScanTypeB()。然而,在我看来,这似乎模糊了类职责之间的界限(例如,RuleParser 应该完成所有的解析工作,而 RuleScanner 应该完成所有的扫描工作)。有没有更简洁的方法来做到这一点?

最佳答案

使用 Inversion of Control principle (通常称为 IoC),这样您就可以独立地测试您的类。

但不要走极端,像处理标量类型一样保留简单的类,只是对它们进行单元测试。

在您的情况下,我会将您的 RuleParserRuleScanner 类从您的 Client 类外部化。

您的 RuleScanner 类还可以获取一个规则列表,您也可以通过插入一个接口(interface)来实现这些规则的外部化,因此您将能够分别测试每个规则。

关于c++ - 如何使这些类对单元测试更友好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35205709/

相关文章:

c# - DLL 中的 CreateWindowEx() 创建一个标题为奇数的窗口

c++ - 动态删除代码?

c++ - 逐个处理va_list

python - 如何用doctest测试 float 结果?

java - 开发和生产测试时的不同 URL

unit-testing - Spring集成测试流程异常

unit-testing - 使用mockito模拟HttpClient请求

c# - 测试单个接口(interface)的不同具体实现?

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 使用 dynamic_pointer_cast 时无法动态转换