2016-06-18 4 views
4

xUnit.netのテストクラスでセットアップコードを実行しようとしていますが、テストは実行されていますが、コンストラクタは表示されません。しかし、私は一貫して取得しています私はMemberDataとしてSampleValuesを使用していますので、私はこのxUnit.net:テストクラスのコンストラクタは実行されていませんか?

[Theory] 
[MemberData(nameof(SampleValues))] 
public void ItemShouldBeSameAsPassedInFromConstructor(T value) 
{ 
    var lease = CreateLease(value); 
    Assert.Equal(value, lease.Item); 
} 

のようなテストでそれらを使用することができ

public abstract class LeaseTests<T> 
{ 
    private static readonly object s_lock = new object(); 
    private static IEnumerable<T> s_sampleValues = Array.Empty<T>(); 

    private static void AssignToSampleValues(Func<IEnumerable<T>, IEnumerable<T>> func) 
    { 
     lock (s_lock) 
     { 
      s_sampleValues = func(s_sampleValues); 
     } 
    } 

    public LeaseTests() 
    { 
     AssignToSampleValues(s => s.Concat(CreateSampleValues())); 
    } 

    public static IEnumerable<object[]> SampleValues() 
    { 
     foreach (T value in s_sampleValues) 
     { 
      yield return new object[] { value }; 
     } 
    } 

    protected abstract IEnumerable<T> CreateSampleValues(); 
} 

// Specialize the test class for different types 
public class IntLeaseTests : LeaseTests<int> 
{ 
    protected override IEnumerable<int> CreateSampleValues() 
    { 
     yield return 3; 
     yield return 0; 
     yield return int.MaxValue; 
     yield return int.MinValue; 
    } 
} 

:ここ

は、私のコードの一部ですSampleValuesを使用するすべてのメソッドで「[メソッド]にデータが見つかりませんでした」というエラーが表示されます。私がさらに調査した後、私はLeaseTestsのコンストラクタが実行されていないことも分かった。 AssignToSampleValuesへのコールでブレークポイントを設定すると、ヒットしませんでした。

なぜこのようなことが起こりますか、それを修正するために何ができますか?ありがとう。

答えて

2

特定のテストクラスのインスタンスを作成する前にMemberDataが評価されるため、コンストラクターが実行されていません。私は、これはあなたの要件を満たすかどうかわからないんだけど、次の操作を実行できます。

タイプ固有の実装追加ISampleDataProviderインタフェース

public interface ISampleDataProvider<T> 
{ 
    IEnumerable<int> CreateSampleValues(); 
} 

を定義します。で

public class IntSampleDataProvider : ISampleDataProvider<int> 
{ 
    public IEnumerable<int> CreateSampleValues() 
    { 
     yield return 3; 
     yield return 0; 
     yield return int.MaxValue; 
     yield return int.MinValue; 
    } 
} 

解決し、使用データプロバイダをSampleValues方法

public abstract class LeaseTests<T> 
{ 
    public static IEnumerable<object[]> SampleValues() 
    { 
     var targetType = typeof (ISampleDataProvider<>).MakeGenericType(typeof (T)); 

     var sampleDataProviderType = Assembly.GetAssembly(typeof (ISampleDataProvider<>)) 
               .GetTypes() 
               .FirstOrDefault(t => t.IsClass && targetType.IsAssignableFrom(t)); 

     if (sampleDataProviderType == null) 
     { 
      throw new NotSupportedException(); 
     } 

     var sampleDataProvider = (ISampleDataProvider<T>)Activator.CreateInstance(sampleDataProviderType); 
     return sampleDataProvider.CreateSampleValues().Select(value => new object[] {value}); 
    } 
... 
関連する問題