2017-06-23 19 views
1

私はスペースに基づいて文を分割するユーティリティメソッドの機能をテストするためのxunitテストを書いています。例:入力: "Who go there?"、出力:{"Who"、 "goes"、 "there"}文字列のコレクション/リスト。Listオブジェクトを持つXUnit MemberData

私がしようとした以下の

[Theory] 
    [MemberData(nameof(GetSplitWordHelperTestCases))] 
    public void TestSplitWord(TestSplitWordHelper splitWordHelper) 
    { 
     var actualResult = (List<string>)splitWordHelper.Build().Item1.SplitWord(); 
     var expectedResult = (List<string>)splitWordHelper.Build().Item2; 
     Assert.Equal(expectedResult.Count, actualResult.Count); 

     for(int i = 0; i < actualResult.Count; i++) 
     { 
      Assert.Equal(expectedResult[i], actualResult[i]); 
     } 
    } 

    public static IEnumerable<object[]> GetSplitWordHelperTestCases() 
    { 
     yield return new object[] { new TestSplitWordHelper("Hi There", 
new List<string> { "Hi", "There" }) }; 
    } 

    public class TestSplitWordHelper : IXunitSerializable 
    { 
     private IEnumerable<string> results; 
     private string source; 

     public TestSplitWordHelper() 
     { 

     } 

     public TestSplitWordHelper(string source, IEnumerable<string> results) 
     { 
      this.source = source; 
      this.results = results; 
     } 

     public Tuple<string, IEnumerable<string>> Build() 
     { 
      return new Tuple<string, IEnumerable<string>>(source, this.results); 
     } 
     public void Deserialize(IXunitSerializationInfo info) 
     { 
      source = info.GetValue<string>("source"); 
      results = info.GetValue<IEnumerable<string>>("results"); 
     } 

     public void Serialize(IXunitSerializationInfo info) 
     { 
      info.AddValue("source", source, typeof(string)); 
      info.AddValue("results", results, typeof(IEnumerable<string>)); 
     } 

     public override string ToString() 
     { 
      return string.Join(" ", results.Select(x => x.ToString()).ToArray()); 
     } 
    } 

私は取得しています。このコンパイル

「System.ArgumentExceptionの:私たちはタイプSystem.Collections.Generic.Listをシリアル化する方法がわからない」と、私はこの問題を理解します。 XunitはListをシリアライズできません。

私の使用例を考えて、どのようにテストケースを書くのですか?

ありがとうございます!

答えて

2

XunitはListをシリアル化できません。

トリックは配列に切り替えることになります。実際、Xunit supportsこれです。

このようにすべてとList<string>string[] ...とタダ!できます。

コードのパッチが適用され、テストされたバージョン(適用された変更にはコメントがあります)。

[Theory] 
[MemberData(nameof(GetSplitWordHelperTestCases))] 
public void TestSplitWord(TestSplitWordHelper splitWordHelper) 
{ 
    var actualResult = splitWordHelper.Build().Item1.SplitWord().ToList(); 

    // (List<string>) changed to new List<string(...) 
    var expectedResult = new List<string>(splitWordHelper.Build().Item2); 
    Assert.Equal(expectedResult.Count, actualResult.Count); 

    for (int i = 0; i < actualResult.Count; i++) 
    { 
     Assert.Equal(expectedResult[i], actualResult[i]); 
    } 
} 

public static IEnumerable<object[]> GetSplitWordHelperTestCases() 
{ 
    yield return new object[] { new TestSplitWordHelper("Hi There", 

     // new List<string> changed to new string[] 
     new string[] { "Hi", "There" }) }; 
} 

public class TestSplitWordHelper : IXunitSerializable 
{ 
    private string[] results; 
    private string source; 

    public TestSplitWordHelper() 
    { 

    } 

    public TestSplitWordHelper(string source, string[] results) 
    { 
     this.source = source; 
     this.results = results; 
    } 

    public Tuple<string, string[]> Build() 
    { 
     return new Tuple<string, string[]>(source, results); 
    } 
    public void Deserialize(IXunitSerializationInfo info) 
    { 
     source = info.GetValue<string>("source"); 

     // IEnumerable<string> changed to string[] 
     results = info.GetValue<string[]>("results"); 
    } 

    public void Serialize(IXunitSerializationInfo info) 
    { 
     info.AddValue("source", source, typeof(string)); 

     // IEnumerable<string> changed to string[] 
     info.AddValue("results", results, typeof(string[])); 
    } 

    public override string ToString() 
    { 
     return string.Join(" ", results.Select(x => x.ToString()).ToArray()); 
    } 
} 
関連する問題