Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
In diesem Tutorial wird gezeigt, wie Sie Ihre Grains testen, um sicherzustellen, dass sie sich korrekt verhalten. Es gibt zwei Hauptmethoden, um Ihre Getreide zu testen, und die methode, die Sie auswählen, hängt von der Art der Funktionalität ab, die Sie testen. Verwenden Sie das Microsoft.Orleans.TestingHost NuGet-Paket, um Testsilos für Ihre Grains zu erstellen, oder verwenden Sie ein Mock-Framework wie Moq, um Teile der Orleans Laufzeitumgebung zu mocken, mit der Ihre Grains interagieren.
Verwenden Sie das TestCluster
Das Microsoft.Orleans.TestingHost NuGet-Paket enthält TestCluster, mit dem Sie einen Speichercluster (bestehend aus zwei Silos standardmäßig) zum Testen von Getreide erstellen können.
using Orleans.TestingHost;
namespace Tests;
public class HelloGrainTests
{
[Fact]
public async Task SaysHelloCorrectly()
{
var builder = new TestClusterBuilder();
var cluster = builder.Build();
cluster.Deploy();
var hello = cluster.GrainFactory.GetGrain<IHelloGrain>(Guid.NewGuid());
var greeting = await hello.SayHello("World");
cluster.StopAllSilos();
Assert.Equal("Hello, World!", greeting);
}
}
Aufgrund des Mehraufwands beim Starten eines In-Memory-Clusters sollten Sie ein TestCluster erstellen und es unter mehreren Testfällen wiederverwenden. Erreichen Sie dies beispielsweise mithilfe von Klassen- oder Sammlungsfixaturen in xUnit.
Um einen TestCluster zwischen mehreren Testfällen zu teilen, erstellen Sie zuerst einen Vorrichtungstyp:
using Orleans.TestingHost;
public sealed class ClusterFixture : IDisposable
{
public TestCluster Cluster { get; } = new TestClusterBuilder().Build();
public ClusterFixture() => Cluster.Deploy();
void IDisposable.Dispose() => Cluster.StopAllSilos();
}
Erstellen Sie als Nächstes eine Sammlungseinrichtung:
[CollectionDefinition(Name)]
public sealed class ClusterCollection : ICollectionFixture<ClusterFixture>
{
public const string Name = nameof(ClusterCollection);
}
Sie können jetzt eine TestCluster in Ihren Testfällen wiederverwenden:
using Orleans.TestingHost;
namespace Tests;
[Collection(ClusterCollection.Name)]
public class HelloGrainTestsWithFixture(ClusterFixture fixture)
{
private readonly TestCluster _cluster = fixture.Cluster;
[Fact]
public async Task SaysHelloCorrectly()
{
var hello = _cluster.GrainFactory.GetGrain<IHelloGrain>(Guid.NewGuid());
var greeting = await hello.SayHello("World");
Assert.Equal("Hello, World!", greeting);
}
}
Wenn alle Tests abgeschlossen sind und die In-Memory-Clustersilos beendet werden, ruft xUnit die Dispose() Methode des ClusterFixture Typs auf.
TestCluster hat außerdem einen Konstruktor, der TestClusterOptions akzeptiert, den Sie zum Konfigurieren der Silos im Cluster verwenden können.
Wenn Sie Dependency Injection in Ihrem Silo verwenden, um Dienste für Grains bereitzustellen, können Sie auch dieses Muster verwenden.
using Microsoft.Extensions.DependencyInjection;
using Orleans.TestingHost;
namespace Tests;
public sealed class ClusterFixtureWithConfig : IDisposable
{
public TestCluster Cluster { get; } = new TestClusterBuilder()
.AddSiloBuilderConfigurator<TestSiloConfigurations>()
.Build();
public ClusterFixtureWithConfig() => Cluster.Deploy();
void IDisposable.Dispose() => Cluster.StopAllSilos();
}
file sealed class TestSiloConfigurations : ISiloConfigurator
{
public void Configure(ISiloBuilder siloBuilder)
{
siloBuilder.ConfigureServices(static services =>
{
// TODO: Call required service registrations here.
// services.AddSingleton<T, Impl>(/* ... */);
});
}
}
Verwenden Sie Mocks
Orleans ermöglicht auch das Simulieren vieler Teile des Systems. Für viele Szenarien ist dies der einfachste Weg, Unit-Tests für Grains durchzuführen. Dieser Ansatz hat Einschränkungen (beispielsweise bei der Terminierung von Reentrancy und Serialisierung) und erfordert möglicherweise Grains, die nur in Ihren Komponententests eingeschlossen werden. Das Orleans TestKit bietet einen alternativen Ansatz, bei dem viele dieser Einschränkungen querschritten werden.
Stellen Sie sich beispielsweise vor, dass das Getreide, das Sie testen, mit anderen Getreiden interagiert. Um diese anderen Körner zu verspotten, müssen Sie auch das GrainFactory-Mitglied des Korns, das getestet wird, nachahmen. Standardmäßig ist GrainFactory eine normale protected-Eigenschaft, aber die meisten Mocking-Frameworks erfordern, dass Eigenschaften public und virtual sind, um Mocking zu ermöglichen. Der erste Schritt besteht also darin, sowohl GrainFactory als auch public zu machen:
public new virtual IGrainFactory GrainFactory
{
get => base.GrainFactory;
}
Jetzt können Sie Ihre Komponente außerhalb der Orleans Laufzeit erstellen und Mocking verwenden, um das Verhalten von GrainFactory zu steuern.
using Xunit;
using Moq;
namespace Tests;
public class WorkerGrainTests
{
[Fact]
public async Task RecordsMessageInJournal()
{
var data = "Hello, World";
var journal = new Mock<IJournalGrain>();
var worker = new Mock<WorkerGrain>();
worker
.Setup(x => x.GrainFactory.GetGrain<IJournalGrain>(It.IsAny<Guid>()))
.Returns(journal.Object);
await worker.DoWork(data)
journal.Verify(x => x.Record(data), Times.Once());
}
}
Erstellen Sie hier das Testkorn, WorkerGrain, mithilfe von Moq. Dies ermöglicht das Überschreiben des GrainFactoryVerhaltens, sodass es ein simuliertes IJournalGrainZurückgibt. Anschließend können Sie überprüfen, ob WorkerGrain wie erwartet mit IJournalGrain interagiert.