运行 来自 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)