我有一个类A
,我删除了默认构造函数。
class A {
public:
A() = delete;
A(int a): m_myInt(a) {}
private:
const int m_myInt;
};
int main () {
A foo(1); // works perfect
A bar; // won't compile
}
如何编写良好的单元测试,确保A bar;
无效?我可以编写一个不编译测试并将编译错误作为测试要求。我想知道,如果有更好的方法来编写单元测试吗?
答案 0 :(得分:9)
2)如果99 - 99 - 2
为真,则提供成员常数值等于std::is_trivially_constructible<T>::value
,否则值为true
。
http://en.cppreference.com/w/cpp/types/is_default_constructible
答案 1 :(得分:3)
单元测试没有任何问题,这取决于确认某些代码构造无法编译。单元测试的目的是确定一个或多个代码段是否共同“适合使用” - 并且该标准可以表示功能或非功能(例如质量)属性。如果“适合使用”标准是“代码将无法编译,如果.....”那么一个明显的方法是编写一个故意寻求导致编译失败的单元测试。
这当然是编译器的有效单元测试方法 - 其中测试编译器如何响应不良代码的样本完全适合作为单元测试或单元测试集。
鉴于要求是A
的默认实例化(使用OP的话)“仍然无效”,传递单元测试的基本标准是执行<的代码编译失败/ p>
A bar;
根据要求,可能需要在不同的上下文中测试此类代码(例如,在A
的成员或朋友的检测函数内,在不相关的函数中,在文件范围内等)。因此,此要求可能需要一组单元测试。
要实现此类测试,构建过程必须捕获编译是否失败。成功的编译需要被捕获为失败的测试,相反,编译失败需要被捕获为传递的单元测试。
根据需要捕获多少证据来证明传递(或失败)单元测试的声明,构建过程可能需要捕获并解析编译器诊断 - 例如,确定源文件中的哪些行实际上导致编译失败。
同样地,可能需要进行单元测试或单元测试集,以检查一些代码构造是否编译。
答案 2 :(得分:1)
您可以使用以下特征:
static_assert(!std::is_constructible<A>::value, "!");