2017-10-23 7 views
2

ユニットテストは抽象クラスから継承する具体的なクラスではなく、抽象クラスから実行したいと考えています。私はそれ以外の場合は、それぞれの子クラスのために存在しようとしているユニットテストの行数千人を重複除外するために行うことができます何か他のものがDの抽象クラスからユニットテストを実行しますか?

unittest(this T) { ... } 

abstract class Parent(this T) : GrandParent 
{ 
    ... 
    unittest 
    { 
     T x = new T(); 
     x.something = true; 
     assert(x.something == true); 
    } 
    ... 
} 

あります:私はコンパイルされませんいくつかのことを試してみましたか?あなたは各サブクラスに特化(したがって重複)の基底クラスで満足している場合は

答えて

2

:代わりにstatic assert

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"; 
    } 
} 

、私はBaseにテンプレート制約を持つことが好ましいが、必要があると思います悲しいことに、これはうまくいきません(制約がテストされたときに、DerivedBase!Derivedから継承するかどうかはまだ分かりません。

このパターンは、C++ではCuriously Recurring Template Pattern (CRTP)として知られています。

+0

ありがとうございました!それは私が望んだものを*ちょうど*するだけではありませんでしたが、私のコードで別の問題を修正しました!あなたは魔法使いです! –

関連する問題