AzureFunctions.TestFramework.ServiceBus
0.11.2
dotnet add package AzureFunctions.TestFramework.ServiceBus --version 0.11.2
NuGet\Install-Package AzureFunctions.TestFramework.ServiceBus -Version 0.11.2
<PackageReference Include="AzureFunctions.TestFramework.ServiceBus" Version="0.11.2" />
<PackageVersion Include="AzureFunctions.TestFramework.ServiceBus" Version="0.11.2" />
<PackageReference Include="AzureFunctions.TestFramework.ServiceBus" />
paket add AzureFunctions.TestFramework.ServiceBus --version 0.11.2
#r "nuget: AzureFunctions.TestFramework.ServiceBus, 0.11.2"
#:package AzureFunctions.TestFramework.ServiceBus@0.11.2
#addin nuget:?package=AzureFunctions.TestFramework.ServiceBus&version=0.11.2
#tool nuget:?package=AzureFunctions.TestFramework.ServiceBus&version=0.11.2
AzureFunctions.TestFramework.ServiceBus
ServiceBusTrigger invocation support for the Azure Functions Test Framework. Provides InvokeServiceBusAsync(...), InvokeServiceBusBatchAsync(...), and ConfigureFakeServiceBusMessageActions() — extensions on IFunctionsTestHost that let you trigger Service Bus-triggered functions directly from integration tests without a real Azure Service Bus namespace.
Usage
using Azure.Messaging.ServiceBus;
using AzureFunctions.TestFramework.Core;
using AzureFunctions.TestFramework.ServiceBus;
public class ServiceBusFunctionTests : IAsyncLifetime
{
private IFunctionsTestHost _testHost;
public async Task InitializeAsync()
{
_testHost = await new FunctionsTestHostBuilder()
.WithFunctionsAssembly(typeof(MyServiceBusFunction).Assembly)
.ConfigureFakeServiceBusMessageActions() // required when functions accept ServiceBusMessageActions
.BuildAndStartAsync();
}
// ── Single message (string / byte[] / BinaryData function parameter) ──────────────
[Fact]
public async Task ProcessMessage_WithStringBody_Succeeds()
{
var message = new ServiceBusMessage("Hello from test!");
var result = await _testHost.InvokeServiceBusAsync("ProcessOrderMessage", message);
Assert.True(result.Success);
}
// ── Single message (ServiceBusReceivedMessage function parameter) ─────────────────
[Fact]
public async Task ProcessMessage_WithReceivedMessage_Succeeds()
{
var message = ServiceBusModelFactory.ServiceBusReceivedMessage(
body: BinaryData.FromString("Hello from test!"),
messageId: Guid.NewGuid().ToString());
var result = await _testHost.InvokeServiceBusAsync("ProcessOrderMessage", message);
Assert.True(result.Success);
}
// ── Batch mode (IsBatched = true, ServiceBusReceivedMessage[] parameter) ──────────
[Fact]
public async Task ProcessBatch_WithMultipleMessages_Succeeds()
{
var messages = Enumerable.Range(1, 3)
.Select(i => ServiceBusModelFactory.ServiceBusReceivedMessage(
body: BinaryData.FromString($"order {i}"),
messageId: Guid.NewGuid().ToString()))
.ToList()
.AsReadOnly();
var result = await _testHost.InvokeServiceBusBatchAsync("ProcessOrderBatch", messages);
Assert.True(result.Success);
}
// ── ServiceBusMessageActions injection ────────────────────────────────────────────
[Fact]
public async Task ProcessMessage_CompletesMessageViaActions()
{
var message = ServiceBusModelFactory.ServiceBusReceivedMessage(
body: BinaryData.FromString("Hello!"),
messageId: Guid.NewGuid().ToString());
var result = await _testHost.InvokeServiceBusAsync("ProcessOrderMessage", message);
Assert.True(result.Success);
// Verify that the function called CompleteMessageAsync
var actions = _testHost.Services.GetRequiredService<FakeServiceBusMessageActions>();
Assert.Single(actions.RecordedActions);
Assert.Equal("Complete", actions.RecordedActions[0].Action);
}
public async Task DisposeAsync()
{
await _testHost.StopAsync();
_testHost.Dispose();
}
}
ServiceBusMessageActions and ServiceBusSessionMessageActions
Functions that accept ServiceBusMessageActions or ServiceBusSessionMessageActions as parameters need fake implementations because the real SDK converters require a live gRPC settlement channel. Call ConfigureFakeServiceBusMessageActions() on the builder to register the fakes:
_testHost = await new FunctionsTestHostBuilder()
.WithFunctionsAssembly(typeof(MyFunction).Assembly)
.ConfigureFakeServiceBusMessageActions() // registers fakes + intercepts SDK converters
.BuildAndStartAsync();
After the invocation, resolve the fake from host.Services to assert settlement calls:
var actions = host.Services.GetRequiredService<FakeServiceBusMessageActions>();
// RecordedActions contains every Complete/Abandon/DeadLetter/Defer/RenewLock call made during the invocation
Assert.Equal("Complete", actions.RecordedActions[0].Action);
// Reset between tests if the host is shared (IClassFixture / OneTimeSetUp)
actions.Reset();
For session-enabled topics/queues:
var sessionActions = host.Services.GetRequiredService<FakeServiceBusSessionMessageActions>();
Assert.Contains(sessionActions.RecordedActions, a => a.Action == "RenewSessionLock");
References
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AzureFunctions.TestFramework.Core (>= 0.11.2)
- Microsoft.Azure.Functions.Worker.Extensions.ServiceBus (>= 5.24.0)
-
net8.0
- AzureFunctions.TestFramework.Core (>= 0.11.2)
- Microsoft.Azure.Functions.Worker.Extensions.ServiceBus (>= 5.24.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.11.2 | 81 | 4/14/2026 |
| 0.11.1 | 88 | 4/13/2026 |
| 0.11.0 | 86 | 4/13/2026 |
| 0.10.0 | 89 | 4/11/2026 |
| 0.9.0 | 92 | 4/8/2026 |
| 0.8.0 | 87 | 4/7/2026 |
| 0.7.1 | 88 | 4/7/2026 |
| 0.7.0 | 89 | 4/7/2026 |
| 0.6.0 | 81 | 4/7/2026 |
| 0.5.0 | 89 | 4/2/2026 |
| 0.4.1 | 93 | 4/1/2026 |
| 0.4.0 | 85 | 4/1/2026 |
| 0.3.0 | 87 | 4/1/2026 |
| 0.2.1 | 90 | 3/17/2026 |
| 0.2.0 | 85 | 3/17/2026 |