Wie verspotte ich Azure.Storage.Queue „QueueClient“ im Komponententest?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Wie verspotte ich Azure.Storage.Queue „QueueClient“ im Komponententest?

Post by Guest »

Ich bin ziemlich neu in der C#/.NET-Sprache/im C#/.NET-Framework und habe einige Probleme beim Komponententest einer Klasse und ihrer Methoden, bei denen ein QueueClient aus dem Azure.Storage.Queue-Paket initialisiert wird im Konstruktor meines AzureQueueService , der zum Senden von Nachrichten an eine Azure Storage-Warteschlange verwendet werden soll.
Mein Code sieht so aus:

Code: Select all

using Azure.Storage.Queues;
using my_api.Helpers;

namespace nlp_api.Services.Azure
{
public interface IAzureQueueService
{
Task SendMessageAsync(string message);
}

public class AzureQueueService : IAzureQueueService
{
private readonly QueueClient _queueClient;
private readonly ILogger _logger;

public AzureQueueService(IConfiguration configuration, ILogger logger, IAzureCredentialHelper azureCredentialHelper)
{
_logger = logger;

// Get the Azure Storage Account URL and queue name from configuration
var accountUrl = configuration["AzureConnection:QueueStorageUrl"];
var queueName = configuration["AzureConnection:QueueName"];

// Use the AzureCredentialHelper to get the appropriate TokenCredential
var credential = azureCredentialHelper.GetCredential();

// Create a QueueServiceClient and then retrieve the specific queue client
_queueClient = new QueueClient(new Uri($"{accountUrl}/{queueName}"), credential);
}

public async Task SendMessageAsync(string message)
{
try
{
// Send the plain-text message to the Azure Queue
await _queueClient.SendMessageAsync(message);
_logger.LogInformation("Successfully sent message to queue.");
}
catch (Exception ex)
{
_logger.LogError(ex, "Error occurred while sending message to the queue.");
throw;
}
}
}
}
Für meinen Test habe ich Folgendes versucht:

Code: Select all

using Azure.Storage.Queues;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using my_api.Services.Azure;
using Azure.Core;
using my_api.Helpers;

namespace nlp_api.UnitTests.Services.Azure
{
public class AzureQueueServiceTests
{
[Fact]
public async Task SendMessageAsync_Successfully_Sends_Message()
{
// Arrange
var mockQueueClient = new Mock("https://mockstorageaccount.queue.core.windows.net", "mock-queue");
var mockLogger = new Mock();
var mockCredentialHelper = new Mock();

// Mock GetCredential to return a fake credential
var mockTokenCredential = new Mock();
mockCredentialHelper.Setup(helper => helper.GetCredential()).Returns(mockTokenCredential.Object);

var mockConfiguration = new Mock();
mockConfiguration.Setup(c => c["AzureConnection:QueueStorageUrl"]).Returns("https://mockstorageaccount.queue.core.windows.net");
mockConfiguration.Setup(c => c["AzureConnection:QueueName"]).Returns("mock-queue");

var queueService = new AzureQueueService(mockConfiguration.Object, mockLogger.Object, mockCredentialHelper.Object);

// Mock the SendMessageAsync method to just complete without error
mockQueueClient.Setup(client => client.SendMessageAsync(It.IsAny(), default));

// Act
await queueService.SendMessageAsync("Test message");

// Assert
mockQueueClient.Verify(client => client.SendMessageAsync(It.Is(msg => msg == "Test message"), default), Times.Once);
mockLogger.Verify(logger =>  logger.LogInformation(It.IsAny()), Times.Once);
}
}
}
Ich kann jedoch verstehen, warum dies nicht funktioniert, da „mockQueueClient“ nicht den tatsächlichen QueueClient verspottet, der im Konstruktor des AzureQueueService erstellt wird -Klasse.
Gibt es überhaupt eine Möglichkeit, diesen QueueClient noch zu verspotten, während er im Konstruktor erstellt wird? Ich habe versucht, eine Art Wrapper-Klasse rund um die Erstellung des QueueClient zu erstellen und diesen Wrapper an den Konstruktor meiner AzureQueueService-Klasse zu übergeben, wodurch die Klasse testbar wird. Jetzt muss ich jedoch eine Wrapper-Klasse testen, bei der wiederum der QueueClient im Konstruktor erstellt wird, sodass ich auf dasselbe Problem stoße. Außerdem scheint das Erstellen dieses Wrappers ein großer Aufwand zu sein, nur um meine Klasse testbar zu machen.
Gibt es eine saubere und übersichtliche Möglichkeit, es mir zu ermöglichen, die QueueClient-Instanz innerhalb des Konstruktors von zu simulieren? AzureQueueService Klasse?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post