# Μονάδες δοκιμών Umami.Net -Έναρξη εγγραφής στο ASPM SK2NET Core

# Εισαγωγή

I'μ μια σχετική noob χρησιμοποιώντας Moq (μ εμένα'μ συνειδητοποιώ τις αμφιβολίεςΜSK3μ και προσπαθούσα να δοκιμάσω μια νέα υπηρεσία ΕμέναΜSK4μ προσθέτοντας στο UmamiMSKA5NetMska6UmamiDataMSKI7Αυτό είναι μια υπηρεσία που μου επιτρέπει να τραβήξω δεδομένα από την περίπτωση του Umami για χρήση σε πράγματα όπως η ταξινόμηση των δημοσιεύσεων με τη δημοτικότητα κλπ.

[TOC]

<!--category-- xUnit, ASP.NET Core -->
<datetime class="hidden">2024-09-04T13:22</datetime>

# Το πρόβλημα

Προσπαθούσα να προσθέσω ένα απλό τεστ για τη λειτουργία σύνδεσης που χρειάζομαι όταν τραβάω δεδομένα.
Όπως μπορείτε να δείτε, το ' διατηρεί μια απλή υπηρεσία που μεταδίδει ένα όνομα χρήστη και έναν κωδικό πρόσβασης στο `/api/auth/login` τελικό σημείο και παίρνει ένα αποτέλεσμα. Αν το αποτέλεσμα είναι επιτυχημένο αποθηκεύει το token στο `_token` Το πεδίο και θέτει το `Authorization` Ο τίτλος για το `HttpClient` για χρήση σε μελλοντικές αιτήσεις.

```csharp
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 αναφέρει / αναφέρει αναφορά - αναφέρει το λογισμικό αναφέρουν - αναφέροντας αναφορές - αναφέρει

```csharp
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` [Πακέτο](https://github.com/dotnet/extensions/tree/main/src/Libraries/Microsoft.Extensions.Diagnostics.Testing) που έχει κάποιες πραγματικά χρήσιμες επεκτάσεις για την δοκιμή καταγραφής.

Έτσι, αντί για όλα τα αντικείμενα του Moq πρόσθεσα μόνο το `Microsoft.Extensions.Diagnostics.Testing` πακέτο και προστέθηκε το ακόλουθο στις δοκιμές μου.

```csharp
    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

Στη συνέχεια, οι δοκιμές μου μπορούν να γίνουν:

```csharp
    [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.