2

私はLinQで簡単なグループを書いています

public IList dividedNumbersto5(IEnumerable<int> NumberOfCollection)
{
    IList reminderNumber = NumberOfCollection.ToList().GroupBy(g => g%5).OrderBy(g=>g.Key)
        .Select(g => new { Numbers = g, Remindar = g.Key}).ToList();
    return reminderNumber;                              
}

テストしようとすると、最初のインデックス項目が期待と一致しないと表示されます。

var groupingoperators = new GroupingOperators();
IEnumerable<int> numberOfCollection = new List<int>{ 5,14,9,8};
IList remindernumber = groupingoperators.dividedNumbersto5(numberOfCollection);
IList expectedNumberCollection = new List<int>{0,3,4};
CollectionAssert.AreEqual(expectedNumberCollection, remindernumber);

CollectionAssert.AreEqual が失敗しました。(インデックス 0 の要素が一致しません。)

そのためのテストをどのように書けばよいのだろうか。

4

2 に答える 2

0

テストが失敗する理由は次のとおりです。

   「同じ要素を持つ場合、2 つのコレクションは等しい」
   同じ順序と数量で。」

ソース

基本的に、2 番目のコレクションをもう少しよくモックする必要があります。私はこれがうまくいくと思います:

IList expectedNumberCollection = new List<object>{
 new {Numbers = new List<int>{5},Remindar=0},
 new {Numbers = new List<int>{8},Remindar=3}, 
 new {Numbers = new List<int>{14,9},Remindar=4}
};
于 2013-04-08T00:00:47.443 に答える
0

まず第一に、メソッドから無名型オブジェクトを返すべきではありません! 後でそのような戻り値を使用して何かを行うのは非常に困難です。

Devidedという新しい構造体を作成します。

public struct Devided
{
    public int Reminder { get; set; }
    public List<int> Numbers { get; set; }

    public override bool Equals(object obj)
    {
        if(!(obj is Devided))
            return false;

        var d = (Devided)obj ;

        if(object.ReferenceEquals(this, d))
            return true;

        return this.Reminder == d.Reminder && this.Numbers.SequenceEqual(d.Numbers);
    }

    public override int GetHashCode()
    {
        return Reminder;
    }
}

私は 仕事をするためにオーバーライドEqualsしました。GetHashCodeCollectionAssert

クラスを使用Devidedすると、メソッドの戻り値の型をジェネリックに変更できますIList<Devided>

public static IList<Devided> dividedNumbersto5(IEnumerable<int> NumberOfCollection)
{
    IList<Devided> reminderNumber = NumberOfCollection.ToList().GroupBy(g => g % 5).OrderBy(g => g.Key)
        .Select(g => new Devided { Numbers = g.ToList(), Reminder = g.Key }).ToList();
    return reminderNumber;
}

そしてアサートテスト:

[TestMethod]
public void TestMethod1()
{
    IEnumerable<int> numberOfCollection = new List<int> { 5, 14, 9, 8 };
    IList remindernumber = dividedNumbersto5(numberOfCollection);
    IList expectedNumberCollection = new List<Devided>
    {
        new Devided { Numbers = new List<int>() { 5 }, Reminder = 0 },
        new Devided { Numbers = new List<int>() { 8 }, Reminder = 3 },
        new Devided { Numbers = new List<int>() { 14, 9 }, Reminder = 4 }
    };

    CollectionAssert.AreEqual(expectedNumberCollection, remindernumber);
}

Reminder次の場合は、sのみをチェックできます。

var expectedNumberCollection = new List<int> { 0, 3, 4 };

Assert.IsTrue(expectedNumberCollection.SequenceEqual(remindernumber.Select(x => x.Reminder)));
于 2013-04-08T06:08:34.543 に答える