5

私の C# 単体テストでは、ID のリストに基づいて行のリストを照会することがよくあります。次に、1) すべての ID について、その ID を持つ行が少なくとも 1 つ見つかったこと、および 2) 返されたすべての行について、各行に検索する ID のリストにある ID があることを確認します。これが私が通常それを確認する方法です:

Assert.IsTrue(ids.All(
    id => results.Any(result => result[primaryKey].Equals(id))
), "Not all IDs were found in returned results");

Assert.IsTrue(results.All(
    result => ids.Any(id => result[primaryKey].Equals(id))
), "Returned results had unexpected IDs");

Anyandの使用はそのようなチェックに便利だと思いますが、Allこれは可読性が低いと考える人がいるかどうか、またはこのような双方向チェックを行うためのより良い方法があるかどうかを確認したかったのです。単体テストに Visual Studio 2008 Team System で MSTest を使用しています。あまりにも主観的である場合、これはおそらくコミュニティ wiki である必要があります。

編集:私は現在、Aviad P.の提案に基づいたソリューションを使用しています。また、次のテストに合格したという事実もあります。

string[] ids1 = { "a", "b", "c" };
string[] ids2 = { "b", "c", "d", "e" };
string[] ids3 = { "c", "a", "b" };
Assert.AreEqual(
    1,
    ids1.Except(ids2).Count()
);
Assert.AreEqual(
    2,
    ids2.Except(ids1).Count()
);
Assert.AreEqual(
    0,
    ids1.Except(ids3).Count()
);
4

4 に答える 4

4

Except次の演算子を使用することもできます。

var resultIds = results.Select(x => x[primaryKey]);

Assert.IsTrue(resultIds.Except(ids).Count() == 0,
 "Returned results had unexpected IDs");

Assert.IsTrue(ids.Except(resultIds).Count() == 0,
 "Not all IDs were found in returned results");
于 2010-01-04T20:03:21.000 に答える
3

IMO、可能な限り読みにくい。true / false を返すメソッドを作成して文書化します。次に、Assert.IsTrue(methodWithDescriptiveNameWhichReturnsTrueOrfalse(), "失敗の理由"); を呼び出します。

于 2010-01-04T20:01:17.510 に答える
1

これは、2つの列挙型を処理するために作成したコードのスニペットであり、MS Test で単体テストを実行中に例外をスローします。

使用する

2 つの列挙型を比較します。

 MyAssert.AreEnumerableSame(expected,actual);

例外を管理する

MyAssert.Throws<KeyNotFoundException>(() => repository.GetById(1), string.Empty);

コード

public class MyAssert
    {
        public class AssertAnswer
        {
            public bool Success { get; set; }
            public string Message { get; set; }
        }

        public static void Throws<T>(Action action, string expectedMessage) where T : Exception
        {
            AssertAnswer answer = AssertAction<T>(action, expectedMessage);

            Assert.IsTrue(answer.Success);
            Assert.AreEqual(expectedMessage, answer.Message);
        }

        public static void AreEnumerableSame(IEnumerable<object> enumerable1, IEnumerable<object> enumerable2)
        {
            bool isSameEnumerable = true;
            bool isSameObject ;

            if (enumerable1.Count() == enumerable2.Count())
            {
                foreach (object o1 in enumerable1)
                {
                    isSameObject = false;
                    foreach (object o2 in enumerable2)
                    {
                        if (o2.Equals(o1))
                        {
                            isSameObject = true;
                            break;
                        }
                    }
                    if (!isSameObject)
                    {
                        isSameEnumerable = false;
                        break;
                    }
                }
            }
            else
                isSameEnumerable = false;

            Assert.IsTrue(isSameEnumerable);
        }

        public static AssertAnswer AssertAction<T>(Action action, string expectedMessage) where T : Exception
        {
            AssertAnswer answer = new AssertAnswer();

            try
            {
                action.Invoke();

                answer.Success = false;
                answer.Message = string.Format("Exception of type {0} should be thrown.", typeof(T));
            }
            catch (T exc)
            {
                answer.Success = true;
                answer.Message = expectedMessage;
            }
            catch (Exception e)
            {
                answer.Success = false;
                answer.Message = string.Format("A different Exception was thrown {0}.", e.GetType());
            }

            return answer;
        }
    }
于 2011-09-06T09:23:56.597 に答える
0

NUnit には、CollectionAssert読みやすくするための一連のアサーションがあります。

于 2010-01-04T20:08:12.563 に答える