Как построить пользовательские утверждения в C # / VS? - PullRequest
3 голосов
/ 31 мая 2009

Я столкнулся с ошибкой в ​​некотором коде, которая извлекает метаданные из некоторого текста и помещает их в словарь.

Мой тест не удался, когда я сравнил два словарных объекта, потому что ключи были в другом порядке. Мне все равно, в каком порядке находятся ключи.

Я бы хотел, чтобы метод assert был доступен как:

Assert.AreEquivalent(propsExpected,propsActual)

Это оценило бы как:

Assert.AreEqual(propsExpected.Count, propsActual.Count);
foreach (var key in propsExpected.Keys)
{
    Assert.IsNotNull(props[key]);
    Assert.AreEqual(propsExpected[key], props[key]);
}

Какой лучший способ сделать это?

Ответы [ 6 ]

2 голосов
/ 18 февраля 2011

Ради полноты взгляните на Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert

1 голос
/ 31 мая 2009

С NUnit вы можете сравнить две коллекции, используя ограничение Is.EquivalentTo (). Это ограничение будет оценивать коллекцию и проверять, имеет ли коллекция те же элементы, но не заботится о порядке.

Документация для CollectionEquivalentConstraint Если вы не используете NUnit, возможно, что-то похожее существует в используемой платформе тестирования?

1 голос
/ 31 мая 2009

Если вы можете использовать LINQ,


void Main()
{
    Dictionary d1 = new Dictionary<int, string>();
    Dictionary d2 = new Dictionary<int, string>();  

    d1.Add(1, "1");
    d1.Add(2, "2");  
    d1.Add(3, "3");  

    d2.Add(2, "2");  
    d2.Add(1, "1");  
    d2.Add(3, "3");  

    Console.WriteLine(d1.Keys.Except(d2.Keys).ToArray().Length);  
}

Это выводит 0 на консоль. Кроме пытается найти разницу между двумя списками в приведенном выше примере.

Вы можете сравнить это с 0, чтобы найти, есть ли разница.

РЕДАКТИРОВАТЬ: Вы можете добавить проверку для сравнения длины 2 словарей, прежде чем делать это.
Т.е. вы можете использовать кроме, только , если длина отличается.

0 голосов
/ 26 января 2016

Как отметил @Sprintstar в комментариях к ответу @Michael La Voie, класс Assert не может быть расширен из-за его статической природы, обычно я решаю эту проблему путем создания тестового репозитория, который содержит мои настроенные методы с несколькими утверждениями и другими проверками, происходящими в том же методе. Для бывших

public static class MyTestRepository
{   
    public static void ArePropsEquivalent(
        Dictionary<string, int> propsExpected, 
        Dictionary<string, int> propsActual)
    {
        //Multiple Asserts and validation logic
        //required for Equivalence goes here
    }

    public static void ArePropsSimilar(
        Dictionary<string, int> propsExpected, 
        Dictionary<string, int> propsActual)
    {
        //Multiple Asserts and validation logic 
        //required for similarity goes here
    }
}

Затем я вызываю эти методы из методов модульного тестирования.

[TestMethod]
public void TestMthod1()
{
    //Props declaration goes here
    MyTestRepository.ArePropsEquivalent(propsExpected, propsActual);
}

[TestMethod]
public void TestMthod2()
{
    //Props declaration goes here
    MyTestRepository.ArePropsSimilar(propsExpected, propsActual);
}

Таким образом, я могу писать меньше и делать больше в реальных методах модульного теста и поддерживать его модульным (в случае разных моделей).

0 голосов
/ 31 мая 2009

Хитрость здесь в том, чтобы использовать новую функцию .Net 3.5, называемую методы расширения

Например, чтобы получить класс Assert для поддержки метода AreEquivalent с использованием кода, который вы предоставили выше, вы должны сделать что-то вроде этого:

public static class MyAssertExtensions
{
    public static void AreEquivalent(this Assert ast, 
        Dictionary<string, int> propsExpected, 
        Dictionary<string, int> propsActual)
    {
        Assert.AreEqual(propsExpected.Count, propsActual.Count);
        foreach (var key in propsExpected.Keys)
        {
            Assert.IsNotNull(props[key]);
            Assert.AreEqual(propsExpected[key], props[key]);
        }
    }
}

Таким образом, вы можете назвать утверждение так:

Assert.AreEquivalent(propsExpected,propsActual);
0 голосов
/ 31 мая 2009

Из этих сообщений похоже, что MbUnit уже поддерживает это с AreElementsEqualIgnoringOrder.

http://japikse.blogspot.com/2008/12/my-favorite-mbunit-assertions.html

http://blog.bits -in-motion.com / 2008/10 / объявляя-Gallio-и-MBUnit-v304.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...