2017-12-24 20 views
3

私は、SUTタイプ以外にも、いくつかの同様の見た目のテストクラスを持っているIEquatable<T>を実装しているモデルの大きなコレクションを持っています。テストでは、インプリメンテーションとテスト中のモデルによって実装されているその他の共通の側面が検証されます。ジェネリックスなしのテストクラスの簡素化

抽象ジェネリックテストクラスを使用しても大したことはありませんが、演算子のコンパイル時のオーバーロード解決が緩和され、いずれの型に対しても派生テストクラスを実装する必要があります。

属性を使用すると、派生したテストクラスが不要になりますが、演算子のコンパイル時のオーバーロードの解決は残ります。

オペレータのコンパイル時のオーバーロード解決を維持し、テストメソッドを呼び出すためのオブジェクトの単一のコレクション(タイプであるかどうか)を持つ別のアプローチがありますか?以下の例で

、私はMemberDataを使用するが、彼らは(のみジェネリック型パラメータが使用されて)使用されないように==!=オペレータとテストメソッドのシグネチャが最適未満で起動するためにリフレクションを使用しなければなりません。

[Theory] 
[MemberData(nameof(GetModelTypes))] 
public void MyTest<T>(T _) 
    where T : class, new() 
{ 
    var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    // Add any known type customization's... 

    T t = fixture.Create<T>(); 
    // Implement remaining generic test body. 
} 

public static IEnumerable<object[]> GetModelTypes() => 
{ 
    new object[] {new ModelA()}, 
    new object[] {new ModelB()}, 
    /* ... */ 
} 

オブジェクトのコレクションを1つ保守し、コンパイル時の過負荷解決でテストできる方法論を知っている人はいますか?

答えて

1

することはできwrite generic unit test classes with xUnit.net:あなたは似て見えるのテストの多くを持っている場合、それはAutoFixture.Idiomsに探して価値があり、特にそのIdiomaticAssertion基底クラスであってもよいし、言っ

public abstract class ModelTests<T> 
{ 
    [Fact] 
    public void MyTest() 
    { 
     var fixture = new Fixture(); 
     var sut = fixture.Create<T>(); 

     // The rest of the test goes here... 
    } 

    // More tests go here... 
} 

public class ModelATests : ModelTests<ModelA> { } 
public class ModelBTests : ModelTests<ModelB> { } 

+0

私は醜いテスト署名が好きではなかったので、それはそれを改善します。今私は 'op_Equality'と' op_Inequality'メンバーを取得するためにリフレクションを使用していますので、有効な結果を得ることができます。私は 'IdiomaticAsserts'を探しています。 – Ritmo2k

+0

@ Ritmo2kええ、私はF#でテストを書いて、ジェネリック制約を使うことができると思います。 C#では、あなたは運がないと思います。 –

1

まず、さまざまな動作をテストするための単一の静的なコレクションを持つことは自殺の一種です。自分を撃たないでください。第二に、あなたが達成しようとしていることは、現在は属性を持っているためにリフレクションを実行する権限が与えられていることを除いて、はっきりしません。あなたの質問が、ジェネリック医薬品と一緒にすべてを反映していたということについては、本当に可能です。 typeof(GenericType<>).MakeGenericType(...)のようなものをチェックしてください。このような

+0

簡略化のために、各テストクラスは型宣言を除いて同じ行の行です。コードの重複を避けることを除けば、タイプごとに1つのタイプのコレクションに対して1つのタイプのコレクションを維持することは、オーバーヘッドです。 MemberDataはそれを可能にしますが、私の実装は最適ではありません。 – Ritmo2k

+0

タイプの違いだけで全く同じものが得られた場合は、クラスを汎用にアップグレードします。あなたはそれをすることができませんか? – 52hertz

+0

私は、明確化のために質問を更新しました。 – Ritmo2k