测试儿童的方法是否已经过载

时间:2014-04-15 13:22:58

标签: c++ testing

在大型代码库中,我们遇到了以下问题:

A类包含method1(a,b,c)

B类继承自A,并包含method1(a,b,c)(A中的一个重载)

当将新的默认参数添加到A类的method1时出现问题,但是:

  • 未添加到B类的method1;
  • B.method1(...)因此被称为A类(父母)的方法1。

修复很简单,因为新参数被添加到B的方法中。

我想编写一个单元测试来检查B的方法和A的方法是否具有完全相同的参数数量(即,B的方法应该总是更新)。

您对我如何做到这一点有什么想法吗?

注意:没有c ++ 11。

以下是我的案例的类似代码:

部首:

class Parent:
{
 public:
  virtual bool method(int a, int b, int c=1);
};

class Child: public Parent
{
 public:
  virtual bool method(int a, int b);
};

CPP:

class Parent:
{
  boot method(int a, int b, int c)
  {
...
  }
}

class Child:
{
  boot method(int a, int b)
  {
...
  }
}

由于代码在第一次使用3个参数时尚未更新,我们仍然调用Child.method(a,b),没有第三个参数。

稍后,它将破坏代码,但我的目的只是确保两个方法始终具有相同数量/类型的参数。

3 个答案:

答案 0 :(得分:1)

assert(&method != &Parent::method);

那样的东西?我没试过。

答案 1 :(得分:1)

以下无法编译为
bool method(int a, int b)隐藏bool method(int a, int b, int c)https://ideone.com/rf4TU5

Child child;

child.method(1, 2, 3);

检查类验证某个接口的可能性:

#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature)       \
    template <typename U>                                           \
    class traitsName                                                \
    {                                                               \
    private:                                                        \
        template<typename T, T> struct helper;                      \
        template<typename T>                                        \
        static char check(helper<signature, &funcName>*);           \
        template<typename T> static char (&check(...))[2];          \
    public:                                                         \
        static                                                      \
        const bool value = sizeof(check<U>(0)) == sizeof(char);     \
    }

DEFINE_HAS_SIGNATURE(has_method_2, T::method, bool (T::*)(int, int));
DEFINE_HAS_SIGNATURE(has_method_3, T::method, bool (T::*)(int, int, int));

// Aggregate all requirements for Interface
template <typename T>
struct check_Parent_Interface
{
    static const bool value = !has_method_2<T>::value && has_method_3<T>::value;
};

在测试中,请检查:https://ideone.com/pPitVq

EXPECTED(true, check_Parent_Interface<Parent>::value);
EXPECTED(true, check_Parent_Interface<Child>::value);

答案 2 :(得分:0)

您的测试听起来更像是烟雾测试,然后是实际的单元测试imo。

如果您已经对代码进行了烟雾测试,则可以在A和B的头文件中添加一个对method1的函数定义执行diff的测试,并查看它们是否足够相似(完全匹配,完全匹配)剥离空格/制表符,相同数量的逗号......)。