Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie

Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie
1 maja 2024 Brak komentarzy Testowanie Tajko

Assert.Fail

Assert.Fail nie jest bezpośrednio dostępna w xUnit jako taka, ponieważ xUnit zachęca do używania asercji typu “Assert.True(false, message);” aby wymusić niepowodzenie testu. Tego rodzaju asercja jest używana, gdy chcemy bezpośrednio zgłosić błąd w teście.

Prosty przykład:

[Fact]
public void TestShouldFail()
{
    // Act & Assert
    // Wymuszenie niepowodzenia testu
    Assert.True(false, "Test failed intentionally.");
}

Przykład z mockowaniem:

Podobny do powyższego, mockowanie nie jest tu konieczne, gdyż asercja nie zależy od zewnętrznych zależności.

Assert.False

Assert.False sprawdza, czy podane wyrażenie boolowskie jest fałszywe. Jest to używane do weryfikacji, że określone warunki nie są spełnione.

Prosty przykład:

[Fact]
// Definiuje metodę jako test jednostkowy
public void UserIsMinor_ReturnsFalse_WhenAgeIsOver18()
{
    // Arrange
    // Tworzenie nowego użytkownika z wiekiem 20 lat
    User user = new User { Age = 20 };


    // Act
    // Sprawdzenie, czy wiek użytkownika jest mniejszy lub równy 18 lat
    bool isMinor = user.Age <= 18;

    // Assert
    // Potwierdzenie, że użytkownik nie jest nieletni
    Assert.False(isMinor);
}
Assert.InRange

Assert.InRange sprawdza, czy dana wartość liczbowа mieści się w określonym zakresie.

Prosty przykład:

[Fact]
public void ValueIsWithinRange()
{
    // Arrange
    // Definiowanie liczby
    int number = 5;

    // Act & Assert
    // Sprawdzenie, czy liczba znajduje się w zakresie od 1 do 10
    Assert.InRange(number, 1, 10);
}

Przykład z mockowaniem:

[Fact]
public void TemperatureIsWithinSafeLimits()
{
    // Arrange
    var mockThermostat = new Mock<IThermostat>();

    // Konfiguracja mocka zwracającego aktualną temperaturę
    mockThermostat.Setup(t => t.CurrentTemperature).Returns(72);

    // Act
    // Pobranie temperatury
    var temp = mockThermostat.Object.CurrentTemperature;

    // Assert
    // Sprawdzenie, czy temperatura jest w bezpiecznych granicach
    Assert.InRange(temp, 60, 75);
}
Assert.IsAssignableFrom

Assert.IsAssignableFrom<T> sprawdza, czy dany obiekt może być przypisany do zmiennej określonego typu T. Jest to przydatne, kiedy chcemy upewnić się, że obiekt implementuje określony interfejs lub dziedziczy z danej klasy.

Prosty przykład:

[Fact]
public void ObjectIsAssignableFromType()
{
    // Arrange
    // Definicja obiektu jako ciągu znaków
    object someObject = "To jest ciąg znaków";

    // Act & Assert
    // Sprawdzenie, czy obiekt można przypisać do typu string
    Assert.IsAssignableFrom<string>(someObject);
}

Przykład z mockowaniem:

[Fact]
public void ServiceIsAssignableFromBaseType()
{
    // Arrange
    // Tworzenie mocka dla MyService
    var mockService = new Mock<MyService>();

    // Act & Assert
    // Sprawdzenie, czy mock MyService można przypisać do typu ServiceBase
    Assert.IsAssignableFrom<ServiceBase>(mockService.Object);
}
Assert.IsNotAssignableFrom

Assert.IsNotAssignableFrom<T> weryfikuje, że dany obiekt nie może być przypisany do zmiennej określonego typu T.

Prosty przykład:

[Fact]
public void ObjectIsNotAssignableFromType()
{
    // Arrange
    // Definicja obiektu jako listy liczb całkowitych
    object someObject = new List<int>();

    // Act & Assert
    // Sprawdzenie, czy obiekt nie może być przypisany do typu string
    Assert.IsNotAssignableFrom<string>(someObject);
}

Przykład z mockowaniem:

[Fact]
public void ServiceIsNotAssignableFromUnrelatedType()
{
    // Arrange
    // Tworzenie mocka dla MyService
    var mockService = new Mock<MyService>();

    // Act & Assert
    // Sprawdzenie, czy mock MyService nie może być przypisany do interfejsu IDisposable
    Assert.IsNotAssignableFrom<IDisposable>(mockService.Object);
}
Assert.IsNotType

Assert.IsNotType<T> sprawdza, czy obiekt nie jest dokładnie danego typu T. Jest to użyteczne do weryfikacji, że obiekt nie jest instancją określonej klasy.

Prosty przykład:

[Fact]
public void ObjectIsNotOfType()
{
    // Arrange
    // Definicja obiektu jako listy liczb całkowitych
    object someObject = new List<int>();

    // Act & Assert
    // Sprawdzenie, czy obiekt nie jest typu string
    Assert.IsNotType<string>(someObject);
}

Przykład z mockowaniem:

[Fact]
public void ServiceIsNotOfTypeUnrelatedClass()
{
    // Arrange
    // Tworzenie mocka dla MyService
    var mockService = new Mock<MyService>();

    // Act & Assert
    // Sprawdzenie, czy mock MyService nie jest typu DateTime
    Assert.IsNotType<DateTime>(mockService.Object);
}
Assert.IsType

Assert.IsType<T> sprawdza, czy dany obiekt jest dokładnie typu T. Jest to użyteczne, gdy chcesz upewnić się, że metoda zwraca obiekt oczekiwanego typu.

Prosty przykład:

[Fact]
public void ObjectIsOfType()
{
    // Arrange
    // Przykładowy obiekt typu string
    object result = "Siema z rana gra gitara!";

    // Act & Assert
    // Sprawdzenie, czy wynik jest typu string
    Assert.IsType<string>(result);
}

Przykład z mockowaniem:

[Fact]
public void ServiceReturnsCorrectType()
{
    // Arrange
    // Tworzenie mocka usługi
    var mockService = new Mock<IMyService>();

    // Konfiguracja usługi, aby zwracała dane typu string
    mockService.Setup(s => s.GetData()).Returns("Przykładowe dane");

    // Act
    // Wywołanie metody, aby pobrać dane
    var result = mockService.Object.GetData();

    // Assert
    // Sprawdzenie, czy zwrócone dane są typu string
    Assert.IsType<string>(result);
}
Assert.Matches

Assert.Matches weryfikuje, czy określony ciąg znaków pasuje do wzorca wyrażenia regularnego.

Prosty przykład:

[Fact]
public void StringMatchesPattern()
{
    // Arrange
    // Definicja ciągu wejściowego
    string input = "Hello123";

    // Act & Assert
    // Sprawdzenie, czy ciąg znaków pasuje do wzorca (jedno lub więcej znaków alfanumerycznych)
    Assert.Matches(@"^\w+$", input);
}

Przykład z mockowaniem:

[Fact]
public void UsernameMatchesExpectedPattern()
{
    // Arrange
    var mockUser = new Mock<IUser>();
    
    // Konfiguracja mocka zwracającego nazwę użytkownika
    mockUser.Setup(u => u.Username).Returns("User_123");

    // Act
    // Pobranie nazwy użytkownika
    var username = mockUser.Object.Username;

    // Assert
    // Sprawdzenie, czy nazwa użytkownika pasuje do wzorca (słowo_liczba)
    Assert.Matches(@"^\w+_\d+$", username);
}
Assert.Multiple

Assert.Multiple pozwala na wykonanie wielu asercji w jednym bloku testu, zbierając wyniki z każdej asercji przed zgłoszeniem błędu. Jest to szczególnie przydatne w scenariuszach, gdzie chcemy przetestować wiele warunków bez przerwania testu po pierwszej napotkanej nieudanej asercji.

Prosty przykład:

[Fact]
public void ValidatesMultipleProperties()
{
    // Arrange
    var person = new Person { Name = "John Doe", Age = 30 };

    // Act & Assert
    Assert.Multiple(() =>
    {
        Assert.Equal("John Doe", person.Name);  // Sprawdzenie, czy imię się zgadza
        Assert.Equal(30, person.Age);           // Sprawdzenie, czy wiek się zgadza
    });
}
Assert.NotEmpty

Assert.NotEmpty służy do weryfikacji, że kolekcja nie jest pusta.

Prosty przykład:

[Fact]
public void ListIsNotEmpty()
{
    // Arrange
    // Tworzenie listy z jednym elementem
    var elements = new List<string> { "apple" };

    // Act & Assert
    // Potwierdzenie, że lista nie jest pusta
    Assert.NotEmpty(elements);
}

Przykład z mockowaniem:

[Fact]
public void ProductsAvailableForSale()
{
    // Arrange
    var mockProductRepository = new Mock<IProductRepository>();

    // Konfiguracja mocka, aby zwracał listę dostępnych produktów
    mockProductRepository
        .Setup(repo => repo.GetAvailableProducts())
        .Returns(new List<Product> { new Product { Name = "Laptop" } });

    // Tworzenie serwisu z zmockowanym repozytorium
    var productService = new ProductService(mockProductRepository.Object);

    // Act
    // Pobranie dostępnych produktów
    var products = productService.GetAvailableProducts();

    // Assert
    // Potwierdzenie, że lista produktów nie jest pusta
    Assert.NotEmpty(products);
}
Tagi
O Autorze
Tajko
Tajko Tajko z tej strony:) Obecnie pracuję we Wrocławiu przy projektach desktopowych. Skoro sam się czegoś nauczyłem to i inni mogliby nauczyć się tego co ja w łopatologiczny sposób:)

ZOSTAW ODPOWIEDŹ