двустороннее сравнение списков в модульном тесте C # - PullRequest
5 голосов
/ 04 января 2010

В моих модульных тестах C # я часто запрашиваю список строк на основе списка идентификаторов. Затем я хочу убедиться, что 1) для всех идентификаторов была найдена хотя бы одна строка с этим идентификатором, и 2) для всех возвращенных строк каждая строка имеет идентификатор, который находится в списке идентификаторов для поиска. Вот как я обычно гарантирую, что:

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");

Я думаю, что использование Any и All удобно для таких проверок, но я хотел посмотреть, считает ли кто-нибудь, что это менее читабельно, чем могло бы быть, или есть ли более хороший способ сделать два путь проверяет вот так. Я использую MSTest в Visual Studio 2008 Team System для модульного тестирования. Возможно, это должна быть вики сообщества, если она слишком субъективна.

Редактировать: Сейчас я использую решение, основанное на предложении Авиад П., а также на том факте, что следующий тест пройден:

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 голосов
/ 04 января 2010

Вы можете использовать оператор 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");
3 голосов
/ 04 января 2010

IMO, не так читабельно, как могло бы быть. Создайте и задокументируйте метод, который возвращает истину / ложь. Затем вызовите Assert.IsTrue (methodWithDescriptiveNameWhichReturnsTrueOrfalse (), «причина сбоя»);

1 голос
/ 06 сентября 2011

Вот фрагмент кода, который я сделал для работы с двумя перечислимыми, и выбрасываю исключение при выполнении модульного теста. В MS Test это может помочь:

Используйте

Сравните два перечислимых значения:

 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;
        }
    }
0 голосов
/ 04 января 2010

NUnit имеет семейство утверждений CollectionAssert, которые помогают удобочитаемости.

...