Używam TestCaseSource na NUnit 2.6.1 do testowania tych samych Asserts z różnymi parametrami konstruktora klasy obiektów.

Mam na myśli,

[Test, TestCaseSource("myConstructorsForMale")}
public void CheckMale(Person p) 
{
     Assert.That(p.IsMale);
}

static Person[] myConstructorsForMale = 
                     {
                         new Person("John"),
                         new Person(isMale=true),
                         new Person("Doe")
                     };

Ok, wszystko działa dobrze, ale taki wynik otrzymałem na konsoli NUnit:

  • Sprawdź Male
    • Sprawdź Mężczyzna (osoba)
    • Sprawdź Mężczyzna (osoba)
    • Sprawdź Mężczyzna (osoba)

Więc nie wiem, jaki test jest wykonywany w każdej iteracji, a jeśli którykolwiek z nich nie powiedzie się, nie mogę uzyskać tego, który test jest nieudany.

Moje pytanie brzmi: czy jest jakiś sposób na identyfikację z komentarzem lub czymś podobnym, jaki jest parametr przekazywany do testu? (w sposób TestCaseSource Attribute)

Dzięki.

5
ferpega 19 październik 2012, 16:55

2 odpowiedzi

Najlepsza odpowiedź

Jeśli używasz „natywnego” NUnitor ReSharper jako biegacza testowego, możesz zastąpić metodę ToString aby mieć dobre definicje Osoby. Na przykład Twój kod testowy może wyglądać tak:

public class PersonTests
{
    [Test, TestCaseSource("myConstructorsForMale")]
    public void CheckMale(Person p)
    {
        Assert.That(p.IsMale);
    }

    static Person[] myConstructorsForMale = 
                 {
                     new Person("John"),
                     new Person{IsMale=true},
                     new Person("Doe")
                 };
}

Klasa osoby może wyglądać tak:

public class Person
{
    public Person(string name)
    {
        this.Name = name;
    }

    public Person() { }

    public string Name { get; set; }
    public bool IsMale { get; set; }

    public override string ToString()
    {
        return string.Format("Name:{0};IsMale:{1}", Name, IsMale);
    }
}

Okno wyników będzie wyglądać tak: Wyniki uruchomienia testu ReSharper

Sprawdziłem to również na natywnym programie uruchamiającym testy NUnit, którego prawdopodobnie używasz. Ładnie wyświetla również osoby: Wyniki testu NUnit

11
Ilya Ivanov 19 październik 2012, 17:43

Riffing na odpowiedzi Ilyi Ivanov, jeśli nie chcesz modyfikować testowanej klasy tylko po to, aby ją przetestować, możesz umieścić logikę „to string” w urządzeniu testowym.

Dodaj metodę do urządzenia, taką jak:

IEnumerable<TestCaseData> PersonTestCases()
{
  myConstructorsForMale.Select(
    p => new TestCaseData(p).SetName(string.Format("Name:{0};IsMale:{1}" ,p.Name, p.IsMale));
  );
}

To tworzy instancję TestCaseData dla każdej Osoby z Twojej listy myConstructorsForMale. Sztuczka polega na tym, że ustawia właściwość Name instancji TestCaseData, aby poinformować program uruchamiający test, co ma wyświetlić.

Niektórzy testerzy mogą działać lepiej z SetDescription niż SetName.

Następnie zmodyfikuj swój atrybut TestCaseSource na:

[Test, TestCaseSource("PersonTestCases")]

Powinno to spowodować coś takiego:

  • Sprawdź Male
    • Imię:;IsMale:Prawda
    • Imię:Kowalski;IsMęski:Fałsz
    • Imię:Jan;IsMężczyzna:Fałsz
4
Robert Gowland 13 maj 2016, 21:24