Генерация кода для создания объекта с текущими значениями - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть такой сценарий, который, я думаю, должен быть довольно распространенным:

class Parameter
{
  public int someInt;
  private decimal someDecimal;
  public SubParameter subParameter;
}

class SubParameter
{
  public string someString { get; set; }
}

У меня есть точка останова при вызове метода, который принимает параметр в качестве параметра. Я хочу написать модульный тест, где я вызываю этот метод с тем же самым точным значением (копия объекта Parameter "дерево"). В этом случае очень утомительно писать множество строк, объявляющих и инициализирующих все поля и свойства класса, которые сами по себе могут быть не примитивными и т. Д. Было бы неплохо, если бы я мог просто щелкнуть правой кнопкой мыши по переменной параметра и затем автоматически сгенерировать код для создания такого объекта.

Так что, если на моей точке останова, мой объект Parameter имеет значение

Parameter parameter = new Parameter
  {
    someInt = 42, 
    someDecimal = 42.42m, 
    subParameter = new SubParameter { someString = "42" }
  };

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

Существует ли такая вещь?


Edit:

Полагаю, мне было неясно. Я прекрасно знаю, как писать код самостоятельно.

Я хочу, чтобы, когда я нажимал на точку останова и смотрел сложную переменную (или любую другую переменную), я хотел иметь возможность сказать: «Сгенерируйте для меня код, который создает клон этой переменной. Я бы использовал сгенерированный код для моего модульного теста.

Существует ли такой инструмент?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Вы можете использовать TestInitialize для инициализации методов тестирования:

    [TestClass]
    public class UnitTest1
    {
        Parameter _parameter = null;

        [TestInitialize]
        public void Initialize()
        {
            _parameter = new Parameter
            {
                someInt = 42,
                someDecimal = 42.42m,
                subParameter = new SubParameter { someString = "42" }
            };
        }

        [TestCleanup]
        public void Cleanup()
        {
            _parameter = null;
        }

        [TestMethod]
        public void MyTest1()
        {
           // test _parameter
        }

        [TestMethod]
        public void MyTest2()
        {
           // test _parameter
        }
    }
0 голосов
/ 09 сентября 2011

Просто создайте вспомогательный метод для создания параметра для вас:

public void CreateParameter()
{
    return new Parameter
    {
        someInt = 42, 
        someDecimal = 42.42m, 
        subParameter = new SubParameter { someString = "42" }
    };
}

Пример использования

[TestMethod]
public void MyTest()
{
    SomeClass.MethodBeingTested(CreateParameter());
}

Если вы хотите иметь конкретное значение параметра, то измените возвращаемый параметр или предоставьте перегрузку, которая позволяет вам указать это значение:

[TestMethod]
public void MyTest()
{
    Parameter parameter = CreateParameter();
    parameter.someInt = 23;
    SomeClass.MethodBeingTested(parameter);
}

У меня обычно CreateParameter заполнение параметра случайными значениями, чтобы уменьшить вероятность того, что модульный тест пройдет "случайно" для некоторых значений, но не получится для других.

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