Μονάδες δοκιμών Umami.Net -Έναρξη εγγραφής στο ASPM SK2NET Core
Εισαγωγή
I'μ μια σχετική noob χρησιμοποιώντας Moq (μ εμένα'μ συνειδητοποιώ τις αμφιβολίεςΜSK3μ και προσπαθούσα να δοκιμάσω μια νέα υπηρεσία ΕμέναΜSK4μ προσθέτοντας στο UmamiMSKA5NetMska6UmamiDataMSKI7Αυτό είναι μια υπηρεσία που μου επιτρέπει να τραβήξω δεδομένα από την περίπτωση του Umami για χρήση σε πράγματα όπως η ταξινόμηση των δημοσιεύσεων με τη δημοτικότητα κλπ.
Το πρόβλημα
Προσπαθούσα να προσθέσω ένα απλό τεστ για τη λειτουργία σύνδεσης που χρειάζομαι όταν τραβάω δεδομένα.
Όπως μπορείτε να δείτε, το ' διατηρεί μια απλή υπηρεσία που μεταδίδει ένα όνομα χρήστη και έναν κωδικό πρόσβασης στο /api/auth/login τελικό σημείο και παίρνει ένα αποτέλεσμα. Αν το αποτέλεσμα είναι επιτυχημένο αποθηκεύει το token στο _token Το πεδίο και θέτει το Authorization Ο τίτλος για το HttpClient για χρήση σε μελλοντικές αιτήσεις.
public class AuthService(HttpClient httpClient, UmamiDataSettings umamiSettings, ILogger<AuthService> logger)
{
private string _token = string.Empty;
public HttpClient HttpClient => httpClient;
public async Task<bool> LoginAsync()
{
var loginData = new
{
username = umamiSettings.Username,
password = umamiSettings.Password
};
var content = new StringContent(JsonSerializer.Serialize(loginData), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("/api/auth/login", content);
if (response.IsSuccessStatusCode)
{
var authResponse = await response.Content.ReadFromJsonAsync<AuthResponse>();
if (authResponse == null)
{
logger.LogError("Login failed");
return false;
}
_token = authResponse.Token;
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _token);
logger.LogInformation("Login successful");
return true;
}
logger.LogError("Login failed");
return false;
}
}
Τώρα ήθελα επίσης να δοκιμάσω εναντίον του συνδετήρα για να βεβαιωθεί ότι ήταν η σύνδεση των σωστών μηνυμάτων. μου άρεσε'm χρησιμοποιώντας το Microsoft.Extensions.Logging nameespace και ήθελα να δοκιμάσω ότι τα σωστά μηνύματα καταγραφής ήταν γραμμένα στο logger.
Στο Moq υπάρχουν αναφορές' αναφέρει ένα BUNCH των δημοσιεύσεων γύρω από την δοκιμή καταχώρισης έχουν όλοι αυτή τη βασική φόρμα ( αναφέρεται από https αναφέρονται από:// αναμένεται να αναφερθεί . αναφέρθηκε . αναφέρθηκαν / αναφέρει blog αναφέρει / αναφέρει αναφορά - αναφέρει το λογισμικό αναφέρουν - αναφέροντας αναφορές - αναφέρει
public static Mock<ILogger<T>> VerifyDebugWasCalled<T>(this Mock<ILogger<T>> logger, string expectedMessage)
{
Func<object, Type, bool> state = (v, t) => v.ToString().CompareTo(expectedMessage) == 0;
logger.Verify(
x => x.Log(
It.Is<LogLevel>(l => l == LogLevel.Debug),
It.IsAny<EventId>(),
It.Is<It.IsAnyType>((v, t) => state(v, t)),
It.IsAny<Exception>(),
It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)));
return logger;
}
HOWEVER εξαιτίας του Moq' αναφέρει τις πρόσφατες αλλαγές (Αναφέρθηκε στο .Αυτός ο τύπος είναι τώρα παλιόςΜSK3 και ASPM SK4NET ΚορυφόροMK5 αναφέρει αλλαγές σε FormattedLogValues Είχα μια δύσκολη στιγμή να πάρει αυτό για να εργαστεί.
Δοκίμασα ένα BUNCH των εκδόσεων και των παραλλαγών αλλά πάντα απέτυχε. ΈτσιΜSK1Αποχώρησα.
Η λύση
Έτσι διαβάζοντας ένα πλήθος των μηνυμάτων GitHub ήρθα σε μια ανάρτηση από τον David Fowler (my πρώην συνάδελφος και τώρα ο Κύριος του ΜSK1NET) που έδειξε έναν απλό τρόπο για να δοκιμάσετε τη σύνδεση στο ASPM SK3NET CoreMK4
Αυτό χρησιμοποιεί το Καινούργιο για μένα Microsoft.Extensions.Diagnostics.Testing Πακέτο που έχει κάποιες πραγματικά χρήσιμες επεκτάσεις για την δοκιμή καταγραφής.
Έτσι, αντί για όλα τα αντικείμενα του Moq πρόσθεσα μόνο το Microsoft.Extensions.Diagnostics.Testing πακέτο και προστέθηκε το ακόλουθο στις δοκιμές μου.
public IServiceProvider GetServiceProvider (string username="username", string password="password")
{
var services = new ServiceCollection();
var mockLogger = new FakeLogger<UmamiDataService>();
var authLogger = new FakeLogger<AuthService>();
services.AddScoped<ILogger<UmamiDataService>>(_ => mockLogger);
services.AddScoped<ILogger<AuthService>>(_ => authLogger);
services.SetupUmamiData(username, password);
return services.BuildServiceProvider();
}
Σας αρέσει' αναμένεται να δείτε ότι αυτό ρυθμίζει το ServiceCollection μου, αναμένω προσθέτει το νέο FakeLogger<T> Και στη συνέχεια, δημιουργεί το UmamiData υπηρεσία με το όνομα χρήστη και τον κωδικό πρόσβασης που θέλω να χρησιμοποιήσω (so μπορώ να δοκιμάσω την αποτυχία).
Οι δοκιμές χρησιμοποιώντας FakeLogger
Στη συνέχεια, οι δοκιμές μου μπορούν να γίνουν:
[Fact]
public async Task SetupTest_Good()
{
var serviceProvider = GetServiceProvider();
var authService = serviceProvider.GetRequiredService<AuthService>();
var authLogger = serviceProvider.GetRequiredService<ILogger<AuthService>>();
var result = await authService.LoginAsync();
var fakeLogger = (FakeLogger<AuthService>)authLogger;
FakeLogCollector collector = fakeLogger.Collector; // Collector allows you to access the captured logs
IReadOnlyList<FakeLogRecord> logs = collector.GetSnapshot();
Assert.Contains("Login successful", logs.Select(x => x.Message));
Assert.True(result);
}
Όπου θα σας αρέσει το ' αναμένεται να δείτε ότι απλώς καλούμαι τον GetServiceProvider μέθοδος για να πάρετε τον παρόχο υπηρεσιών μου, και στη συνέχεια να AuthService και ILogger<AuthService> από τον πάροχο υπηρεσιών.
Επειδή έχω αυτά τα συστήματα ως FakeLogger<T> Στη συνέχεια μπορώ να αποκτήσω πρόσβαση στο FakeLogCollector και FakeLogRecord Για να πάρετε τα λογότυπα και να τα ελέγξετε.
Στη συνέχεια μπορώ απλά να ελέγξω τα λογότυπα για τα σωστά μηνύματα.
Στο συμπέρασμα
Έτσι, υπάρχει ένας απλός τρόπος για να δοκιμάσετε τα μηνύματα καταγραφής σε δοκιμές μονάδων χωρίς την ανοησία του Moq.