运行 来自 D 中摘要 class 的单元测试?
Run unit tests from abstract class in D?
我想 运行 从抽象 class 而不是从继承它的具体 class 中进行单元测试。我尝试了一些无法编译的东西:
unittest(this T) { ... }
abstract class Parent(this T) : GrandParent
{
...
unittest
{
T x = new T();
x.something = true;
assert(x.something == true);
}
...
}
我还能做些什么来 de-duplicate 数千行单元测试,否则每个 child class 都会存在?
如果您对每个子class专门(并因此重复)的基础class感到满意:
abstract class Base(T) {
static assert(is(T : typeof(this)), "Tried to instantiate "~typeof(this).stringof~" with type parameter "~T.stringof);
unittest {
import std.stdio : writeln;
auto a = new T();
writeln(a.s);
}
}
class Derived : Base!Derived {
string s() {
return "a";
}
}
而不是 static assert
,我更希望在 Base
上有一个模板约束,但遗憾的是这不起作用(当约束被测试时,我们还没有知道 Derived
是否继承自 Base!Derived
,因为这当然只发生在约束通过之后。
此模式在 C++ 中称为 Curiously Recurring Template Pattern (CRTP)。
我想 运行 从抽象 class 而不是从继承它的具体 class 中进行单元测试。我尝试了一些无法编译的东西:
unittest(this T) { ... }
abstract class Parent(this T) : GrandParent
{
...
unittest
{
T x = new T();
x.something = true;
assert(x.something == true);
}
...
}
我还能做些什么来 de-duplicate 数千行单元测试,否则每个 child class 都会存在?
如果您对每个子class专门(并因此重复)的基础class感到满意:
abstract class Base(T) {
static assert(is(T : typeof(this)), "Tried to instantiate "~typeof(this).stringof~" with type parameter "~T.stringof);
unittest {
import std.stdio : writeln;
auto a = new T();
writeln(a.s);
}
}
class Derived : Base!Derived {
string s() {
return "a";
}
}
而不是 static assert
,我更希望在 Base
上有一个模板约束,但遗憾的是这不起作用(当约束被测试时,我们还没有知道 Derived
是否继承自 Base!Derived
,因为这当然只发生在约束通过之后。
此模式在 C++ 中称为 Curiously Recurring Template Pattern (CRTP)。