Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie
Zrozumienie Asercji w xUnit: Kluczowe Metody i Ich Zastosowanie
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);
}
