Передача объекта в параметрах метода MSTest - PullRequest
0 голосов
/ 24 октября 2018

Я разрабатываю игру на линкоре в ASP.NET, и у меня возникла проблема с моими юнит-тестами с помощью MSTest.

Я хочу проверить создание каждого типа лодки и убедиться, что каждыйконструктор лодки делает нужную лодку с хорошей шириной и т. д. Итак, я решил написать общий метод с тегом [DataTestMethod].Но я не понимаю, как я могу использовать объект в качестве параметра.

Вот пример того, что я хочу:

[DataTestMethod]
[DataRow("Aircraft Cruiser", 5, OccupationType.Aircraft, new Aircraft())]
public void CreateAircraft(string description, int width, OccupationType occupationType, Ship resultShip)
{
    var expectedShip = new Ship
    {
        Description = description,
        Width = width,
        OccupationType = occupationType
    };
    Assert.AreEqual(expectedShip, resultShip)
}

Но это явно не работает.Поэтому я сделал что-то подобное:

[DataTestMethod]
[DataRow("Aircraft Cruiser", 5, OccupationType.Aircraft, "Aircraft")]
public void CreateAircraft(string description, int width, OccupationType occupationType, string shipType)
{
    var expectedShip = new Ship
    {
        Description = description,
        Width = width,
        OccupationType = occupationType
    };

    Ship resultShip = null;
    switch (shipType)
    {
        case "Aircraft":
            resultShip = new Aircraft();
            break;
    }
    Assert.AreEqual(expectedShip, resultShip);
}

, но я уверен, что это не самый эффективный способ сделать то, что я хочу.У вас есть идея?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Первый пример просто невозможно сделать в C #.Согласно спецификации, атрибуты должны принимать постоянные параметры в своем конструкторе / свойствах, а все остальное запрещено (так как атрибуты запекаются в двоичном файле во время компиляции).В этом случае то, что делает его неудачным, - это вызов конструктора new Aircraft() в атрибуте, который является неконстантным выражением (он запускает конструктор класса Aircraft), поэтому он вообще не может использоваться в атрибутах.

Как обходной путь, строка обычно является хорошим кандидатом.Обратите внимание, что C # 6 вводит оператор nameof, чтобы упростить это и обеспечить некоторую поддержку компилятора, как показано ниже:

[DataRow("Aircraft Cruiser", 5, OccupationType.Aircraft, nameof(Aircraft))]

Что касается самого кода метода, то switch является опцией, если вы знаете всевозможности заранее, но в противном случае вам нужно задействовать рефлексию для создания объекта из имени класса.

0 голосов
/ 24 октября 2018

Вы сравниваете ссылочные типы, которые не работают при сравнении ссылок в памяти, и они не будут равны.Вы должны переопределить функцию Equals (), а затем использовать ее в своих тестах.

.Net Функция Equals

Функция Equals принимает тип, а затем вы простосделайте сравнения, например, добавьте это к вашему классу кораблей:

   public override bool Equals(Ship obj) 
   {
       if (this.Width != obj.Width)
       {
           return false;
       }  

       return true;
   }

Затем вы просто делаете это в своих тестах:

Assert.IsTrue(expectedShip.Equals(resultShip))
...