W xUnit istnieje atrybut BeforeAfterTest jego implementacja posiada dwie wirtualne metody Before oraz After. Jak ich nazwy wskazują są uruchamiane przed i po wykonaniu testu. Przy pomocy polimorfizmu, możemy dodać interesujący nas kod do tych metod.

 

Rys.1. Solucja TestingPatterns

Do projektu xUnitFeatures dodałem nowy plik o nazwie BeforeAfterTestAttributeTests.cs Znajdzie się w nim nasz atrybut, który nazwałem BeforeAfter oraz wykorzystująca go klasa z testem BeforeAfterTestAttributeTests.

Zobaczmy zatem kod tego pliku:

using System.Reflection;
using Xunit;
using Xunit.Sdk;

namespace xUnitFeatures
{
    public class BeforeAfter : BeforeAfterTestAttribute
    {
        public override void Before(MethodInfo methodUnderTest)
        {
            //interesujący nas kod uruchamiany przed wykonaniem testu
            base.Before(methodUnderTest);
        }

        public override void After(MethodInfo methodUnderTest)
        {
            //interesujący nas kod uruchamiany po wykonaniu testu
            base.After(methodUnderTest);
        }
    }

    public class BeforeAfterTestAttributeTests
    {
        [Fact]
        [BeforeAfter]
        public void BeforeAfterExample()
        {
           // kod testu
        }
    }
}

Oczywiście możemy stworzyć atrybut nadpisujący tylko jedną z metod BeforeAfterTestAttribute. Nie przedstawiam bardziej rozbudowanego przykładu wykorzystania tego atrybutu ponieważ zależne jest ono od specyficznych potrzeb. W codziennej pracy do tej pory nie musiałem z niego korzystać. Ale wiedza o jego istnieniu, może przydać się w przyszłości. Za jego pomocą pisząc testy integracyjne z bazą danych, możemy odtwarzać jej schemat przed wykonaniem każdego testu.