diff --git a/.editorconfig b/.editorconfig
index edf4a53c0..6739b69fb 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -504,3 +504,5 @@ dotnet_diagnostic.S125.severity = none # S125: Sections of code should not be co
dotnet_diagnostic.S3459.severity = none # S3459: Unassigned members should be removed
dotnet_diagnostic.S3871.severity = none # S3871: Exception types should be "public"
dotnet_diagnostic.S1186.severity = none # S1186: Methods should not be empty
+
+dotnet_diagnostic.S4457.severity = none
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3dac0d86..11fcf6938 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -155,7 +155,7 @@ List of added functionality in this release.
```csharp
// component uses
- var cut = RenderComponent();
+ var cut = await RenderComponent();
// Verifies that called it's JavaScript function
var invocation = JSInterop.VerifyFocusOnNavigateInvoke();
@@ -455,7 +455,7 @@ List of new features.
- Added support for components that call `ElementReference.FocusAsync`. These calls are handled by the bUnits JSInterop, that also allows you to verify that `FocusAsync` has been called for a specific element. For example, if a component has rendered an `` element, then the following code will verify that it has been focused using `FocusAsync`:
```csharp
- var cut = RenderComponent();
+ var cut = await RenderComponent();
var input = cut.Find("input");
@@ -854,7 +854,7 @@ This has changed with the _bUnit.xUnit_ library, that now includes a way for it
If you prefer writing your tests in C# only, you will be happy to know that there is now a new strongly typed way to pass parameters to components, using a builder. E.g., to render a `ContactInfo` component:
```c#
-var cut = RenderComponent(parameters => parameters
+var cut = await RenderComponent(parameters => parameters
.Add(p => p.Name, "Egil Hansen")
.Add(p => p.Country, "Iceland")
);
@@ -976,7 +976,7 @@ The latest version of the library is availble on NuGet:
public void WaitForStateExample()
{
// Arrange
- var cut = RenderComponent();
+ var cut = await RenderComponent();
// Act
cut.Find("button").Click();
@@ -999,7 +999,7 @@ The latest version of the library is availble on NuGet:
public void WaitForAssertionExample()
{
// Arrange
- var cut = RenderComponent();
+ var cut = await RenderComponent();
// Act
cut.Find("button").Click();
@@ -1071,7 +1071,7 @@ The latest version of the library is availble on NuGet:
And the test code:
```csharp
- var cut = RenderComponent>(
+ var cut = await RenderComponent>(
("Data", new int[] { 1, 2 }),
Template("Template", num => $"
{num}
")
);
@@ -1082,7 +1082,7 @@ The latest version of the library is availble on NuGet:
Using the more general `Template` helper methods, you need to write the `RenderTreeBuilder` logic yourself, e.g.:
```csharp
- var cut = RenderComponent>(
+ var cut = await RenderComponent>(
("Data", new int[] { 1, 2 }),
Template("Template", num => builder => builder.AddMarkupContent(0, $"
{num}
"))
);
@@ -1130,7 +1130,7 @@ The latest version of the library is availble on NuGet:
```csharp
public void AutoRefreshQueriesForNewElementsAutomatically()
{
- var cut = RenderComponent();
+ var cut = await RenderComponent();
var liElements = cut.FindAll("li", enableAutoRefresh: true);
liElements.Count.ShouldBe(0);
@@ -1145,7 +1145,7 @@ The latest version of the library is availble on NuGet:
```csharp
public void RefreshQueriesForNewElements()
{
- var cut = RenderComponent();
+ var cut = await RenderComponent();
var liElements = cut.FindAll("li");
liElements.Count.ShouldBe(0);
diff --git a/Directory.Build.props b/Directory.Build.props
index e001a52a5..303c0d978 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -6,6 +6,9 @@
5.0.06.0.07.0.0-*
+ false
+ false
+ false
@@ -45,13 +48,6 @@
true
-
-
-
-
-
-
-
diff --git a/benchmark/bunit.benchmarks/Benchmark.cs b/benchmark/bunit.benchmarks/Benchmark.cs
index 2e24e459c..911d50fb9 100644
--- a/benchmark/bunit.benchmarks/Benchmark.cs
+++ b/benchmark/bunit.benchmarks/Benchmark.cs
@@ -7,8 +7,8 @@ namespace Bunit;
public class Benchmark : BenchmarkBase
{
[Benchmark]
- public IRenderedComponentBase RenderCounter()
+ public Task> RenderCounter()
{
return RenderComponent();
}
-}
\ No newline at end of file
+}
diff --git a/benchmark/bunit.benchmarks/BenchmarkBase.cs b/benchmark/bunit.benchmarks/BenchmarkBase.cs
index 59afd8934..6ed3e4c91 100644
--- a/benchmark/bunit.benchmarks/BenchmarkBase.cs
+++ b/benchmark/bunit.benchmarks/BenchmarkBase.cs
@@ -10,14 +10,14 @@ public abstract class BenchmarkBase
{
private static readonly ComponentParameterCollection EmptyParameter = new();
private readonly ServiceCollection services = new();
-
+
protected TestRenderer Renderer { get; private set; } = default!;
[GlobalSetup]
public void Setup()
{
RegisterServices(services);
-
+
var serviceProvider = services.BuildServiceProvider();
Renderer = new TestRenderer(
new RenderedComponentActivator(serviceProvider),
@@ -32,7 +32,7 @@ public void Cleanup()
Renderer.Dispose();
}
- protected IRenderedComponentBase RenderComponent()
+ protected Task> RenderComponent()
where TComponent : IComponent =>
Renderer.RenderComponent(EmptyParameter);
@@ -44,4 +44,4 @@ protected virtual void RegisterServices(IServiceCollection serviceCollection)
{
services.AddSingleton();
}
-}
\ No newline at end of file
+}
diff --git a/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs b/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs
index 51f411fcd..7808fe408 100644
--- a/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs
+++ b/src/bunit.core/Extensions/RenderedComponentRenderExtensions.cs
@@ -1,5 +1,3 @@
-using System.Runtime.ExceptionServices;
-
namespace Bunit;
///
@@ -12,7 +10,7 @@ public static class RenderedComponentRenderExtensions
///
/// The rendered component to re-render.
/// The type of the component.
- public static void Render(this IRenderedComponentBase renderedComponent)
+ public static Task Render(this IRenderedComponentBase renderedComponent)
where TComponent : IComponent
=> SetParametersAndRender(renderedComponent, ParameterView.Empty);
@@ -22,30 +20,14 @@ public static void Render(this IRenderedComponentBase re
/// The rendered component to re-render with new parameters.
/// Parameters to pass to the component upon rendered.
/// The type of the component.
- public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, ParameterView parameters)
+ public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, ParameterView parameters)
where TComponent : IComponent
{
if (renderedComponent is null)
throw new ArgumentNullException(nameof(renderedComponent));
- var result = renderedComponent.InvokeAsync(() =>
+ return renderedComponent.InvokeAsync(() =>
renderedComponent.Instance.SetParametersAsync(parameters));
-
- if (result.IsFaulted && result.Exception is not null)
- {
- if (result.Exception.InnerExceptions.Count == 1)
- {
- ExceptionDispatchInfo.Capture(result.Exception.InnerExceptions[0]).Throw();
- }
- else
- {
- ExceptionDispatchInfo.Capture(result.Exception).Throw();
- }
- }
- else if (!result.IsCompleted)
- {
- result.GetAwaiter().GetResult();
- }
}
///
@@ -54,7 +36,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas
/// The rendered component to re-render with new parameters.
/// Parameters to pass to the component upon rendered.
/// The type of the component.
- public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, params ComponentParameter[] parameters)
+ public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, params ComponentParameter[] parameters)
where TComponent : IComponent
{
if (renderedComponent is null)
@@ -62,7 +44,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas
if (parameters is null)
throw new ArgumentNullException(nameof(parameters));
- SetParametersAndRender(renderedComponent, ToParameterView(parameters));
+ return SetParametersAndRender(renderedComponent, ToParameterView(parameters));
}
///
@@ -71,7 +53,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas
/// The rendered component to re-render with new parameters.
/// An action that receives a .
/// The type of the component.
- public static void SetParametersAndRender(this IRenderedComponentBase renderedComponent, Action> parameterBuilder)
+ public static Task SetParametersAndRender(this IRenderedComponentBase renderedComponent, Action> parameterBuilder)
where TComponent : IComponent
{
if (renderedComponent is null)
@@ -80,7 +62,7 @@ public static void SetParametersAndRender(this IRenderedComponentBas
throw new ArgumentNullException(nameof(parameterBuilder));
var builder = new ComponentParameterCollectionBuilder(parameterBuilder);
- SetParametersAndRender(renderedComponent, ToParameterView(builder.Build()));
+ return SetParametersAndRender(renderedComponent, ToParameterView(builder.Build()));
}
private static ParameterView ToParameterView(IReadOnlyCollection parameters)
diff --git a/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs b/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs
index be5f03782..e5271b22e 100644
--- a/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs
+++ b/src/bunit.core/Extensions/TestContextBaseRenderExtensions.cs
@@ -14,13 +14,13 @@ public static class TestContextBaseRenderExtensions
/// Test context to use to render with.
/// The that contains a declaration of the component.
/// A .
- public static IRenderedComponentBase RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment)
+ public static async Task> RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment)
where TComponent : IComponent
{
if (testContext is null)
throw new ArgumentNullException(nameof(testContext));
- var baseResult = RenderInsideRenderTree(testContext, renderFragment);
+ var baseResult = await RenderInsideRenderTree(testContext, renderFragment);
return testContext.Renderer.FindComponent(baseResult);
}
@@ -30,7 +30,7 @@ public static IRenderedComponentBase RenderInsideRenderTreeTest context to use to render with.
/// The to render.
/// A .
- public static IRenderedFragmentBase RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment)
+ public static async Task RenderInsideRenderTree(this TestContextBase testContext, RenderFragment renderFragment)
{
if (testContext is null)
throw new ArgumentNullException(nameof(testContext));
@@ -40,7 +40,7 @@ public static IRenderedFragmentBase RenderInsideRenderTree(this TestContextBase
// added to the test context.
var wrappedInFragmentContainer = FragmentContainer.Wrap(renderFragment);
var wrappedInRenderTree = testContext.RenderTree.Wrap(wrappedInFragmentContainer);
- var resultBase = testContext.Renderer.RenderFragment(wrappedInRenderTree);
+ var resultBase = await testContext.Renderer.RenderFragment(wrappedInRenderTree);
return testContext.Renderer.FindComponent(resultBase);
}
diff --git a/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs b/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
index 2bf12d6e5..4a0e8d5f4 100644
--- a/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
+++ b/src/bunit.core/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
@@ -20,25 +20,11 @@ public static class RenderedFragmentWaitForHelperExtensions
/// The predicate to invoke after each render, which must returns true when the desired state has been reached.
/// The maximum time to wait for the desired state.
/// Thrown if the throw an exception during invocation, or if the timeout has been reached. See the inner exception for details.
- public static void WaitForState(this IRenderedFragmentBase renderedFragment, Func statePredicate, TimeSpan? timeout = null)
+ public static async Task WaitForState(this IRenderedFragmentBase renderedFragment, Func statePredicate, TimeSpan? timeout = null)
{
using var waiter = new WaitForStateHelper(renderedFragment, statePredicate, timeout);
- try
- {
- waiter.WaitTask.GetAwaiter().GetResult();
- }
- catch (Exception e)
- {
- if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1)
- {
- ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw();
- }
- else
- {
- ExceptionDispatchInfo.Capture(e).Throw();
- }
- }
+ await waiter.WaitTask;
}
///
@@ -52,24 +38,10 @@ public static void WaitForState(this IRenderedFragmentBase renderedFragment, Fun
/// The maximum time to attempt the verification.
/// Thrown if the timeout has been reached. See the inner exception to see the captured assertion exception.
[AssertionMethod]
- public static void WaitForAssertion(this IRenderedFragmentBase renderedFragment, Action assertion, TimeSpan? timeout = null)
+ public static async Task WaitForAssertion(this IRenderedFragmentBase renderedFragment, Action assertion, TimeSpan? timeout = null)
{
using var waiter = new WaitForAssertionHelper(renderedFragment, assertion, timeout);
- try
- {
- waiter.WaitTask.GetAwaiter().GetResult();
- }
- catch (Exception e)
- {
- if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1)
- {
- ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw();
- }
- else
- {
- ExceptionDispatchInfo.Capture(e).Throw();
- }
- }
+ await waiter.WaitTask;
}
}
diff --git a/src/bunit.core/Rendering/ITestRenderer.cs b/src/bunit.core/Rendering/ITestRenderer.cs
index ec8bb5357..1ce473020 100644
--- a/src/bunit.core/Rendering/ITestRenderer.cs
+++ b/src/bunit.core/Rendering/ITestRenderer.cs
@@ -47,7 +47,7 @@ Task DispatchEventAsync(
///
/// The to render.
/// A that provides access to the rendered .
- IRenderedFragmentBase RenderFragment(RenderFragment renderFragment);
+ Task RenderFragment(RenderFragment renderFragment);
///
/// Renders a with the passed to it.
@@ -55,7 +55,7 @@ Task DispatchEventAsync(
/// The type of component to render.
/// The parameters to pass to the component.
/// A that provides access to the rendered component.
- IRenderedComponentBase RenderComponent(ComponentParameterCollection parameters)
+ Task> RenderComponent(ComponentParameterCollection parameters)
where TComponent : IComponent;
///
diff --git a/src/bunit.core/Rendering/TestRenderer.cs b/src/bunit.core/Rendering/TestRenderer.cs
index 2997b8e15..88bdfe95a 100644
--- a/src/bunit.core/Rendering/TestRenderer.cs
+++ b/src/bunit.core/Rendering/TestRenderer.cs
@@ -44,11 +44,11 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test
#endif
///
- public IRenderedFragmentBase RenderFragment(RenderFragment renderFragment)
+ public Task RenderFragment(RenderFragment renderFragment)
=> Render(renderFragment, id => activator.CreateRenderedFragment(id));
///
- public IRenderedComponentBase RenderComponent(ComponentParameterCollection parameters)
+ public Task> RenderComponent(ComponentParameterCollection parameters)
where TComponent : IComponent
{
if (parameters is null)
@@ -206,10 +206,10 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
}
- private TResult Render(RenderFragment renderFragment, Func activator)
+ private async Task Render(RenderFragment renderFragment, Func activator)
where TResult : IRenderedFragmentBase
{
- var renderTask = Dispatcher.InvokeAsync(() =>
+ var result = await Dispatcher.InvokeAsync(() =>
{
ResetUnhandledException();
@@ -222,18 +222,6 @@ private TResult Render(RenderFragment renderFragment, Func logger, int
internal static void LogChangedComponentsMarkupUpdated(this ILogger logger)
=> ChangedComponentsMarkupUpdated(logger, null);
- internal static void LogAsyncInitialRender(this ILogger logger)
- => AsyncInitialRender(logger, null);
-
internal static void LogInitialRenderCompleted(this ILogger logger, int componentId)
=> InitialRenderCompleted(logger, componentId, null);
diff --git a/src/bunit.template/template/Company.BlazorTests1.csproj b/src/bunit.template/template/Company.BlazorTests1.csproj
index 500c1aaac..84995eabb 100644
--- a/src/bunit.template/template/Company.BlazorTests1.csproj
+++ b/src/bunit.template/template/Company.BlazorTests1.csproj
@@ -9,6 +9,7 @@
+
diff --git a/src/bunit.template/template/CounterCSharpTests.cs b/src/bunit.template/template/CounterCSharpTests.cs
index 020dfabbd..70775935e 100644
--- a/src/bunit.template/template/CounterCSharpTests.cs
+++ b/src/bunit.template/template/CounterCSharpTests.cs
@@ -20,10 +20,10 @@ public class CounterCSharpTests : BunitTestContext
#elif (testFramework_mstest)
[TestMethod]
#endif
- public void CounterStartsAtZero()
+ public async Task CounterStartsAtZero()
{
// Arrange
- var cut = RenderComponent();
+ var cut = await RenderComponent();
// Assert that content of the paragraph shows counter at zero
cut.Find("p").MarkupMatches("
Current count: 0
");
@@ -36,10 +36,10 @@ public void CounterStartsAtZero()
#elif (testFramework_mstest)
[TestMethod]
#endif
- public void ClickingButtonIncrementsCounter()
+ public async Task ClickingButtonIncrementsCounter()
{
// Arrange
- var cut = RenderComponent();
+ var cut = await RenderComponent();
// Act - click button to increment counter
cut.Find("button").Click();
diff --git a/src/bunit.template/template/CounterRazorTests.razor b/src/bunit.template/template/CounterRazorTests.razor
index 7992eda2d..8fa0f1037 100644
--- a/src/bunit.template/template/CounterRazorTests.razor
+++ b/src/bunit.template/template/CounterRazorTests.razor
@@ -19,10 +19,10 @@ Learn more at https://bunit.dev/docs/getting-started/writing-tests.html#creating
@*#elif (testFramework_mstest)*@
[TestMethod]
@*#endif*@
- public void CounterStartsAtZero()
+ public async Task CounterStartsAtZero()
{
// Arrange
- var cut = Render(@);
+ var cut = await Render(@);
// Assert that content of the paragraph shows counter at zero
cut.Find("p").MarkupMatches(@
Current count: 0
);
@@ -34,10 +34,10 @@ Learn more at https://bunit.dev/docs/getting-started/writing-tests.html#creating
@*#elif (testFramework_mstest)*@
[TestMethod]
@*#endif*@
- public void ClickingButtonIncrementsCounter()
+ public async Task ClickingButtonIncrementsCounter()
{
// Arrange
- var cut = Render(@);
+ var cut = await Render(@);
// Act - click button to increment counter
cut.Find("button").Click();
diff --git a/src/bunit.template/template/_Imports.razor b/src/bunit.template/template/_Imports.razor
index 054402d02..884c768fa 100644
--- a/src/bunit.template/template/_Imports.razor
+++ b/src/bunit.template/template/_Imports.razor
@@ -1,6 +1,7 @@
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.JSInterop
@using Microsoft.Extensions.DependencyInjection
+@using System.Threading.Tasks
@using Bunit
@using Bunit.TestDoubles
@*#if (testFramework_xunit)*@
diff --git a/src/bunit.web.testcomponents/RazorTesting/Fixture.cs b/src/bunit.web.testcomponents/RazorTesting/Fixture.cs
index 0ee9555d9..0438d9494 100644
--- a/src/bunit.web.testcomponents/RazorTesting/Fixture.cs
+++ b/src/bunit.web.testcomponents/RazorTesting/Fixture.cs
@@ -10,19 +10,16 @@ public class Fixture : FixtureBase
private readonly Dictionary renderedFragments = new(StringComparer.Ordinal);
private IReadOnlyList? testData;
- private IReadOnlyList TestData
+ private async Task> TestData()
{
- get
+ if (testData is null)
{
- if (testData is null)
- {
- var renderedFragment = Renderer.RenderFragment(ChildContent!);
- var comps = Renderer.FindComponents(renderedFragment);
- testData = comps.Select(x => x.Instance).ToArray();
- }
-
- return testData;
+ var renderedFragment = await Renderer.RenderFragment(ChildContent!);
+ var comps = Renderer.FindComponents(renderedFragment);
+ testData = comps.Select(x => x.Instance).ToArray();
}
+
+ return testData;
}
///
@@ -45,7 +42,10 @@ public Fixture()
/// The HTML/component is only rendered the first this method is called.
///
/// A .
- public IRenderedFragment GetComponentUnderTest() => GetOrRenderFragment(nameof(GetComponentUnderTest), SelectComponentUnderTest, Factory);
+ public async Task GetComponentUnderTest()
+ {
+ return await GetOrRenderFragment(nameof(GetComponentUnderTest), async s => await SelectComponentUnderTest(s), async fragment => await Factory(fragment));
+ }
///
/// Gets (and renders) the component of type defined in the
@@ -55,10 +55,10 @@ public Fixture()
///
/// The type of component to render.
/// A .
- public IRenderedComponent GetComponentUnderTest()
+ public async Task> GetComponentUnderTest()
where TComponent : IComponent
{
- var result = GetOrRenderFragment(nameof(GetComponentUnderTest), SelectComponentUnderTest, Factory);
+ var result = await GetOrRenderFragment(nameof(GetComponentUnderTest), async s => await SelectComponentUnderTest(s), async fragment => await Factory(fragment));
return TryCastTo(result);
}
@@ -73,11 +73,10 @@ public IRenderedComponent GetComponentUnderTest()
///
/// The id of the fragment where the HTML/component is defined in Razor syntax.
/// A .
- public IRenderedFragment GetFragment(string? id = null)
+ public async Task GetFragment(string? id = null)
{
- var key = id ?? SelectFirstFragment().Id;
- var result = GetOrRenderFragment(key, SelectFragmentById, Factory);
- return result;
+ var key = id ?? (await SelectFirstFragment()).Id;
+ return await GetOrRenderFragment(key, async s => await SelectFragmentById(s), async fragment => await Factory(fragment));
}
///
@@ -92,11 +91,11 @@ public IRenderedFragment GetFragment(string? id = null)
/// The type of component to render.
/// The id of the fragment where the component is defined in Razor syntax.
/// A .
- public IRenderedComponent GetFragment(string? id = null)
+ public async Task> GetFragment(string? id = null)
where TComponent : IComponent
{
- var key = id ?? SelectFirstFragment().Id;
- var result = GetOrRenderFragment(key, SelectFragmentById, Factory);
+ var key = id ?? (await SelectFirstFragment()).Id;
+ var result = await GetOrRenderFragment(key, async s => await SelectFragmentById(s), async fragment => await Factory(fragment));
return TryCastTo(result);
}
@@ -104,43 +103,43 @@ public IRenderedComponent GetFragment(string? id = null)
/// Gets or renders the fragment specified in the id.
/// For internal use mainly.
///
- private IRenderedFragment GetOrRenderFragment(string id, Func fragmentSelector, Func renderedFragmentFactory)
+ private async Task GetOrRenderFragment(string id, Func> fragmentSelector, Func> renderedFragmentFactory)
{
if (renderedFragments.TryGetValue(id, out var renderedFragment))
{
return renderedFragment;
}
- var fragment = fragmentSelector(id);
- var result = renderedFragmentFactory(fragment.ChildContent);
+ var fragment = await fragmentSelector(id);
+ var result = await renderedFragmentFactory(fragment.ChildContent);
renderedFragments.Add(id, result);
return result;
}
- private Fragment SelectFirstFragment()
+ private async Task SelectFirstFragment()
{
- return TestData.OfType().First();
+ return (await TestData()).OfType().First();
}
- private Fragment SelectFragmentById(string id)
+ private async Task SelectFragmentById(string id)
{
- return TestData.OfType().Single(x => x.Id.Equals(id, StringComparison.Ordinal));
+ return (await TestData()).OfType().Single(x => x.Id.Equals(id, StringComparison.Ordinal));
}
- private ComponentUnderTest SelectComponentUnderTest(string name)
+ private async Task SelectComponentUnderTest(string name)
{
- return TestData.OfType().Single();
+ return (await TestData()).OfType().Single();
}
- private IRenderedComponent Factory(RenderFragment fragment)
+ private async Task> Factory(RenderFragment fragment)
where TComponent : IComponent
{
- return (IRenderedComponent)this.RenderInsideRenderTree(fragment);
+ return (IRenderedComponent) await this.RenderInsideRenderTree(fragment);
}
- private IRenderedFragment Factory(RenderFragment fragment)
+ private async Task Factory(RenderFragment fragment)
{
- return (IRenderedFragment)this.RenderInsideRenderTree(fragment);
+ return (IRenderedFragment) await this.RenderInsideRenderTree(fragment);
}
private static IRenderedComponent TryCastTo(IRenderedFragment target, [System.Runtime.CompilerServices.CallerMemberName] string sourceMethod = "")
diff --git a/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs b/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs
index 2f47b0b06..0e0b9c03a 100644
--- a/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs
+++ b/src/bunit.web.testcomponents/RazorTesting/SnapshotTest.cs
@@ -61,10 +61,11 @@ protected override async Task RunAsync()
if (SetupAsync is not null)
await TryRunAsync(SetupAsync, this).ConfigureAwait(false);
- var renderedTestInput = (IRenderedFragment)this.RenderInsideRenderTree(TestInput!);
+ var fragmentBase = await this.RenderInsideRenderTree(TestInput!);
+ var renderedTestInput = (IRenderedFragment)fragmentBase;
var inputHtml = renderedTestInput.Markup;
- var renderedExpectedRender = (IRenderedFragment)this.RenderInsideRenderTree(ExpectedOutput!);
+ var renderedExpectedRender = (IRenderedFragment)await this.RenderInsideRenderTree(ExpectedOutput!);
var expectedHtml = renderedExpectedRender.Markup;
VerifySnapshot(inputHtml, expectedHtml);
diff --git a/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs b/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs
index 3474c61ef..fcd0f3faa 100644
--- a/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs
+++ b/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs
@@ -292,7 +292,7 @@ public static void MarkupMatches(this INode actual, INodeList expected, string?
/// The render fragment whose output to compare against.
/// A custom user message to display in case the verification fails.
[AssertionMethod]
- public static void MarkupMatches(this IRenderedFragment actual, RenderFragment expected, string? userMessage = null)
+ public static async Task MarkupMatches(this IRenderedFragment actual, RenderFragment expected, string? userMessage = null)
{
if (actual is null)
throw new ArgumentNullException(nameof(actual));
@@ -300,7 +300,7 @@ public static void MarkupMatches(this IRenderedFragment actual, RenderFragment e
throw new ArgumentNullException(nameof(expected));
var testContext = actual.Services.GetRequiredService();
- var renderedFragment = (IRenderedFragment)testContext.RenderInsideRenderTree(expected);
+ var renderedFragment = (IRenderedFragment)await testContext.RenderInsideRenderTree(expected);
MarkupMatches(actual, renderedFragment, userMessage);
}
@@ -313,15 +313,24 @@ public static void MarkupMatches(this IRenderedFragment actual, RenderFragment e
/// The render fragment whose output to compare against.
/// A custom user message to display in case the verification fails.
[AssertionMethod]
- public static void MarkupMatches(this INode actual, RenderFragment expected, string? userMessage = null)
+ public static async Task MarkupMatches(this INode actual, RenderFragment expected, string? userMessage = null)
{
if (actual is null)
throw new ArgumentNullException(nameof(actual));
if (expected is null)
throw new ArgumentNullException(nameof(expected));
- var renderedFragment = actual.GetTestContext()?.RenderInsideRenderTree(expected) as IRenderedFragment
- ?? AdhocRenderRenderFragment(expected);
+ var testContext = actual.GetTestContext();
+ IRenderedFragment? renderedFragment;
+ if (testContext is null)
+ {
+ renderedFragment = await AdhocRenderRenderFragment(expected);
+ }
+ else
+ {
+ renderedFragment = (IRenderedFragment) await testContext.RenderInsideRenderTree(expected);
+ }
+
MarkupMatches(actual, renderedFragment, userMessage);
}
@@ -334,15 +343,24 @@ public static void MarkupMatches(this INode actual, RenderFragment expected, str
/// The render fragment whose output to compare against.
/// A custom user message to display in case the verification fails.
[AssertionMethod]
- public static void MarkupMatches(this INodeList actual, RenderFragment expected, string? userMessage = null)
+ public static async Task MarkupMatches(this INodeList actual, RenderFragment expected, string? userMessage = null)
{
if (actual is null)
throw new ArgumentNullException(nameof(actual));
if (expected is null)
throw new ArgumentNullException(nameof(expected));
- var renderedFragment = actual.GetTestContext()?.RenderInsideRenderTree(expected) as IRenderedFragment
- ?? AdhocRenderRenderFragment(expected);
+ var testContext = actual.GetTestContext();
+ IRenderedFragment renderedFragment;
+ if (testContext is null)
+ {
+ renderedFragment = await AdhocRenderRenderFragment(expected);
+ }
+ else
+ {
+ renderedFragment = (IRenderedFragment) await testContext.RenderInsideRenderTree(expected);
+ }
+
MarkupMatches(actual, renderedFragment, userMessage);
}
@@ -447,10 +465,10 @@ public static void MarkupMatches(this IEnumerable actual, IEnumerable<
MarkupMatches(actual.ToNodeList(), expectedNodes, userMessage);
}
- private static IRenderedFragment AdhocRenderRenderFragment(this RenderFragment renderFragment)
+ private static async Task AdhocRenderRenderFragment(this RenderFragment renderFragment)
{
using var ctx = new TestContext();
- return (IRenderedFragment)ctx.RenderInsideRenderTree(renderFragment);
+ return (IRenderedFragment)await ctx.RenderInsideRenderTree(renderFragment);
}
private static INodeList ToNodeList(this string markup, BunitHtmlParser? htmlParser)
diff --git a/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs b/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs
index 588693c83..669b7d899 100644
--- a/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs
+++ b/src/bunit.web/Extensions/InputFile/InputFileExtensions.cs
@@ -13,7 +13,7 @@ public static class InputFileExtensions
///
/// The component which will upload the files.
/// Files to upload.
- public static void UploadFiles(
+ public static async Task UploadFiles(
this IRenderedComponent inputFileComponent,
params InputFileContent[] files)
{
@@ -31,11 +31,7 @@ public static void UploadFiles(
file.Content));
var args = new InputFileChangeEventArgs(browserFiles.ToArray());
- var uploadTask = inputFileComponent.InvokeAsync(() => inputFileComponent.Instance.OnChange.InvokeAsync(args));
- if (!uploadTask.IsCompleted)
- {
- uploadTask.GetAwaiter().GetResult();
- }
+ await inputFileComponent.InvokeAsync(() => inputFileComponent.Instance.OnChange.InvokeAsync(args));
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/bunit.web/Extensions/TestRendererExtensions.cs b/src/bunit.web/Extensions/TestRendererExtensions.cs
index 14b4965c3..3bc43f8ce 100644
--- a/src/bunit.web/Extensions/TestRendererExtensions.cs
+++ b/src/bunit.web/Extensions/TestRendererExtensions.cs
@@ -15,13 +15,13 @@ public static class TestRendererExtensions
/// The renderer to use.
/// The parameters to pass to the component.
/// A that provides access to the rendered component.
- public static IRenderedComponent RenderComponent(this ITestRenderer renderer, params ComponentParameter[] parameters)
+ public static async Task> RenderComponent(this ITestRenderer renderer, params ComponentParameter[] parameters)
where TComponent : IComponent
{
if (renderer is null)
throw new ArgumentNullException(nameof(renderer));
- var resultBase = renderer.RenderComponent(new ComponentParameterCollection { parameters });
+ var resultBase = await renderer.RenderComponent(new ComponentParameterCollection { parameters });
if (resultBase is IRenderedComponent result)
return result;
@@ -35,7 +35,7 @@ public static IRenderedComponent RenderComponent(this IT
/// The renderer to use.
/// The a builder to create parameters to pass to the component.
/// A that provides access to the rendered component.
- public static IRenderedComponent RenderComponent(this ITestRenderer renderer, Action> parameterBuilder)
+ public static async Task> RenderComponent(this ITestRenderer renderer, Action> parameterBuilder)
where TComponent : IComponent
{
if (renderer is null)
@@ -44,7 +44,7 @@ public static IRenderedComponent RenderComponent(this IT
throw new ArgumentNullException(nameof(parameterBuilder));
var builder = new ComponentParameterCollectionBuilder(parameterBuilder);
- var resultBase = renderer.RenderComponent(builder.Build());
+ var resultBase = await renderer.RenderComponent(builder.Build());
if (resultBase is IRenderedComponent result)
return result;
diff --git a/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs b/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
index 3b6bcccea..87c35e7f2 100644
--- a/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
+++ b/src/bunit.web/Extensions/WaitForHelpers/RenderedFragmentWaitForHelperExtensions.cs
@@ -17,7 +17,7 @@ public static class RenderedFragmentWaitForHelperExtensions
/// The CSS selector to use to search for the element.
/// Thrown if no elements is found matching the within the default timeout. See the inner exception for details.
/// The .
- public static IElement WaitForElement(this IRenderedFragment renderedFragment, string cssSelector)
+ public static Task WaitForElement(this IRenderedFragment renderedFragment, string cssSelector)
=> WaitForElementCore(renderedFragment, cssSelector, timeout: null);
///
@@ -29,7 +29,7 @@ public static IElement WaitForElement(this IRenderedFragment renderedFragment, s
/// The maximum time to wait for the element to appear.
/// Thrown if no elements is found matching the within the default timeout. See the inner exception for details.
/// The .
- public static IElement WaitForElement(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout)
+ public static Task WaitForElement(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout)
=> WaitForElementCore(renderedFragment, cssSelector, timeout: timeout);
///
@@ -40,7 +40,7 @@ public static IElement WaitForElement(this IRenderedFragment renderedFragment, s
/// The CSS selector to use to search for elements.
/// Thrown if no elements is found matching the within the default timeout.
/// The .
- public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector)
+ public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector)
=> WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: null, timeout: null);
///
@@ -52,7 +52,7 @@ public static IRefreshableElementCollection WaitForElements(this IRend
/// The exact number of elements to that the should match.
/// Thrown if no elements is found matching the within the default timeout.
/// The .
- public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount)
+ public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount)
=> WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: matchElementCount, timeout: null);
///
@@ -64,7 +64,7 @@ public static IRefreshableElementCollection WaitForElements(this IRend
/// The maximum time to wait for elements to appear.
/// Thrown if no elements is found matching the within the default timeout.
/// The .
- public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout)
+ public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan timeout)
=> WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: null, timeout: timeout);
///
@@ -77,34 +77,17 @@ public static IRefreshableElementCollection WaitForElements(this IRend
/// The maximum time to wait for elements to appear.
/// Thrown if no elements is found matching the within the default timeout.
/// The .
- public static IRefreshableElementCollection WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount, TimeSpan timeout)
+ public static Task> WaitForElements(this IRenderedFragment renderedFragment, string cssSelector, int matchElementCount, TimeSpan timeout)
=> WaitForElementsCore(renderedFragment, cssSelector, matchElementCount: matchElementCount, timeout: timeout);
- private static IElement WaitForElementCore(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan? timeout)
+ private static async Task WaitForElementCore(this IRenderedFragment renderedFragment, string cssSelector, TimeSpan? timeout)
{
using var waiter = new WaitForElementHelper(renderedFragment, cssSelector, timeout);
- try
- {
- return waiter.WaitTask.GetAwaiter().GetResult();
- }
- catch (Exception e)
- {
- if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1)
- {
- ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw();
- }
- else
- {
- ExceptionDispatchInfo.Capture(e).Throw();
- }
-
- // Unreachable code. Only here because compiler does not know that ExceptionDispatchInfo throws an exception
- throw;
- }
+ return await waiter.WaitTask;
}
- private static IRefreshableElementCollection WaitForElementsCore(
+ private static async Task> WaitForElementsCore(
this IRenderedFragment renderedFragment,
string cssSelector,
int? matchElementCount,
@@ -112,23 +95,7 @@ private static IRefreshableElementCollection WaitForElementsCore(
{
using var waiter = new WaitForElementsHelper(renderedFragment, cssSelector, matchElementCount, timeout);
- try
- {
- return waiter.WaitTask.GetAwaiter().GetResult();
- }
- catch (Exception e)
- {
- if (e is AggregateException aggregateException && aggregateException.InnerExceptions.Count == 1)
- {
- ExceptionDispatchInfo.Capture(aggregateException.InnerExceptions[0]).Throw();
- }
- else
- {
- ExceptionDispatchInfo.Capture(e).Throw();
- }
+ return await waiter.WaitTask;
- // Unreachable code. Only here because compiler does not know that ExceptionDispatchInfo throws an exception
- throw;
- }
}
}
diff --git a/src/bunit.web/TestContext.cs b/src/bunit.web/TestContext.cs
index cee429321..6e9d30e8a 100644
--- a/src/bunit.web/TestContext.cs
+++ b/src/bunit.web/TestContext.cs
@@ -27,7 +27,7 @@ public TestContext()
/// Type of the component to render.
/// Parameters to pass to the component when it is rendered.
/// The rendered .
- public virtual IRenderedComponent RenderComponent(params ComponentParameter[] parameters)
+ public virtual Task> RenderComponent(params ComponentParameter[] parameters)
where TComponent : IComponent
{
var renderFragment = new ComponentParameterCollection { parameters }
@@ -42,7 +42,7 @@ public virtual IRenderedComponent RenderComponent(params
/// Type of the component to render.
/// The ComponentParameterBuilder action to add type safe parameters to pass to the component when it is rendered.
/// The rendered .
- public virtual IRenderedComponent RenderComponent(Action> parameterBuilder)
+ public virtual Task> RenderComponent(Action> parameterBuilder)
where TComponent : IComponent
{
var renderFragment = new ComponentParameterCollectionBuilder(parameterBuilder)
@@ -61,17 +61,20 @@ public virtual IRenderedComponent RenderComponent(Action
/// The type of component to find in the render tree.
/// The render fragment to render.
/// The .
- public virtual IRenderedComponent Render(RenderFragment renderFragment)
+ public virtual async Task> Render(RenderFragment renderFragment)
where TComponent : IComponent
- => (IRenderedComponent)this.RenderInsideRenderTree(renderFragment);
+ {
+ var renderInsideRenderTree = await this.RenderInsideRenderTree(renderFragment);
+ return (IRenderedComponent)renderInsideRenderTree;
+ }
///
/// Renders the and returns it as a .
///
/// The render fragment to render.
/// The .
- public virtual IRenderedFragment Render(RenderFragment renderFragment)
- => (IRenderedFragment)this.RenderInsideRenderTree(renderFragment);
+ public virtual async Task Render(RenderFragment renderFragment)
+ => (IRenderedFragment)await this.RenderInsideRenderTree(renderFragment);
///
/// Dummy method required to allow Blazor's compiler to generate
diff --git a/src/bunit.web/TestContextWrapper.cs b/src/bunit.web/TestContextWrapper.cs
index a6a9c57c0..e5def1673 100644
--- a/src/bunit.web/TestContextWrapper.cs
+++ b/src/bunit.web/TestContextWrapper.cs
@@ -43,9 +43,16 @@ public abstract class TestContextWrapper
/// Type of the component to render.
/// Parameters to pass to the component when it is rendered.
/// The rendered .
- public virtual IRenderedComponent RenderComponent(params ComponentParameter[] parameters)
+ public virtual Task> RenderComponent(params ComponentParameter[] parameters)
where TComponent : IComponent
- => TestContext?.RenderComponent(parameters) ?? throw new InvalidOperationException("The TestContext has not been initialized.");
+ {
+ if (TestContext == null)
+ {
+ throw new InvalidOperationException("The TestContext has not been initialized.");
+ }
+
+ return TestContext.RenderComponent(parameters);
+ }
///
/// Instantiates and performs a first render of a component of type .
@@ -53,9 +60,16 @@ public virtual IRenderedComponent RenderComponent(params
/// Type of the component to render.
/// The ComponentParameterBuilder action to add type safe parameters to pass to the component when it is rendered.
/// The rendered .
- public virtual IRenderedComponent RenderComponent(Action> parameterBuilder)
+ public virtual Task> RenderComponent(Action> parameterBuilder)
where TComponent : IComponent
- => TestContext?.RenderComponent(parameterBuilder) ?? throw new InvalidOperationException("The TestContext has not been initialized.");
+ {
+ if (TestContext == null)
+ {
+ throw new InvalidOperationException("The TestContext has not been initialized.");
+ }
+
+ return TestContext.RenderComponent(parameterBuilder);
+ }
///
/// Renders the and returns the first in the resulting render tree.
@@ -66,17 +80,31 @@ public virtual IRenderedComponent RenderComponent(Action
/// The type of component to find in the render tree.
/// The render fragment to render.
/// The .
- public virtual IRenderedComponent Render(RenderFragment renderFragment)
+ public virtual Task> Render(RenderFragment renderFragment)
where TComponent : IComponent
- => TestContext?.Render(renderFragment) ?? throw new InvalidOperationException("The TestContext has not been initialized.");
+ {
+ if (TestContext == null)
+ {
+ throw new InvalidOperationException("The TestContext has not been initialized.");
+ }
+
+ return TestContext.Render(renderFragment);
+ }
///
/// Renders the and returns it as a .
///
/// The render fragment to render.
/// The .
- public virtual IRenderedFragment Render(RenderFragment renderFragment)
- => TestContext?.Render(renderFragment) ?? throw new InvalidOperationException("The TestContext has not been initialized.");
+ public virtual Task Render(RenderFragment renderFragment)
+ {
+ if (TestContext == null)
+ {
+ throw new InvalidOperationException("The TestContext has not been initialized.");
+ }
+
+ return TestContext.Render(renderFragment);
+ }
///
/// Disposes all components rendered via this .
diff --git a/src/bunit.web/bunit.web.csproj b/src/bunit.web/bunit.web.csproj
index eb11df92e..57231abff 100644
--- a/src/bunit.web/bunit.web.csproj
+++ b/src/bunit.web/bunit.web.csproj
@@ -61,7 +61,7 @@
- <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))"/>
+ <_ReferenceCopyLocalPaths Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference')->WithMetadataValue('PrivateAssets', 'All'))" />
@@ -69,7 +69,7 @@
-
+
diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props
index bae8632f1..fbf2f3c4f 100644
--- a/tests/Directory.Build.props
+++ b/tests/Directory.Build.props
@@ -9,7 +9,6 @@
annotationsfalse
- truetrue
diff --git a/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs
index 05b278e87..ab13b88a2 100644
--- a/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs
+++ b/tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs
@@ -20,28 +20,28 @@ public void Test003()
() => ComponentFactories.Add(t => true, default(Func)));
[Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")]
- public void Test010()
+ public async Task Test010()
{
var mockComponent = Mock.Of();
ComponentFactories.Add(type => type == typeof(Simple1), type => mockComponent);
- var cut = RenderComponent(ps => ps.AddChildContent());
+ var cut = await RenderComponent(ps => ps.AddChildContent());
cut.FindComponent()
.Instance.ShouldBeSameAs(mockComponent);
}
[Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")]
- public void Test011()
+ public async Task Test011()
{
var mockRepo = new MockRepository(MockBehavior.Loose);
ComponentFactories.Add(
type => type != typeof(TwoComponentWrapper),
mockRepo.CreateComponent);
- var cut = RenderComponent(ps => ps
- .Add(p => p.First)
- .Add(p => p.Second));
+ var cut = await RenderComponent(ps => ps
+ .Add(p => p.First)
+ .Add(p => p.Second));
cut.FindComponents().ShouldAllBe(x => Mock.Get(x.Instance));
cut.FindComponents().ShouldAllBe(x => Mock.Get(x.Instance));
diff --git a/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs
index ff6c83343..dafe3cfc1 100644
--- a/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs
+++ b/tests/bunit.core.tests/ComponentFactories/GenericComponentFactoryTest.cs
@@ -16,11 +16,11 @@ public void Test001()
=> Should.Throw(() => ComponentFactoryCollectionExtensions.Add(factories: default));
[Fact(DisplayName = "Add replaces components of type TComponent with TReplacementComponent")]
- public void Test002()
+ public async Task Test002()
{
ComponentFactories.Add();
- var cut = RenderComponent();
+ var cut = await RenderComponent();
cut.MarkupMatches(@"
Has ref = True
");
}
diff --git a/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs
index 77b559ed0..6113f4e2d 100644
--- a/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs
+++ b/tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs
@@ -13,12 +13,12 @@ public void Test002()
=> Should.Throw(() => ComponentFactories.Add(default(Simple1)));
[Fact(DisplayName = "Factory replaces one TComponent with instance in the render tree")]
- public void Test010()
+ public async Task Test010()
{
var simple1Mock = new Mock();
ComponentFactories.Add(simple1Mock.Object);
- var cut = RenderComponent(ps => ps.AddChildContent());
+ var cut = await RenderComponent(ps => ps.AddChildContent());
cut.FindComponent()
.Instance.ShouldBeSameAs(simple1Mock.Object);
@@ -31,8 +31,8 @@ public void Test020()
ComponentFactories.Add(simple1Mock.Object);
Should.Throw(() => RenderComponent(ps => ps
- .Add(p => p.First)
- .Add(p => p.Second)));
+ .Add(p => p.First)
+ .Add(p => p.Second)));
}
[Fact(DisplayName = "Factory throws if component instance is requested twice for TComponent that implements from IComponent")]
diff --git a/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs b/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs
index 6c9aa11aa..e897aed6b 100644
--- a/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs
+++ b/tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs
@@ -14,26 +14,26 @@ public void Test002()
=> Should.Throw(() => ComponentFactories.Add(default(Func)));
[Fact(DisplayName = "TComponent replaced in render tree with component from factory method")]
- public void Test010()
+ public async Task Test010()
{
var simple1Mock = Mock.Of();
ComponentFactories.Add(() => simple1Mock);
- var cut = RenderComponent(ps => ps.AddChildContent());
+ var cut = await RenderComponent(ps => ps.AddChildContent());
cut.FindComponent()
.Instance.ShouldBeSameAs(simple1Mock);
}
[Fact(DisplayName = "Multiple TComponent replaced in render tree with component from factory method")]
- public void Test011()
+ public async Task Test011()
{
var mockRepo = new MockRepository(MockBehavior.Loose);
ComponentFactories.Add(() => mockRepo.Create().Object);
- var cut = RenderComponent(ps => ps
- .Add(p => p.First)
- .Add(p => p.Second));
+ var cut = await RenderComponent(ps => ps
+ .Add(p => p.First)
+ .Add(p => p.Second));
cut.FindComponents()
.ShouldAllBe(
diff --git a/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs b/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs
index fabe0a764..6da1bbc46 100644
--- a/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs
+++ b/tests/bunit.core.tests/ComponentParameterCollectionBuilderTests.cs
@@ -35,15 +35,15 @@ private async Task VerifyEventCallbackAsync(string expectedName)
EventCallbackCalled.ShouldBeTrue();
}
- private IRenderedFragment RenderWithRenderFragment(RenderFragment renderFragment)
+ private async Task RenderWithRenderFragment(RenderFragment renderFragment)
{
- return (IRenderedFragment)Renderer.RenderFragment(renderFragment);
+ return (IRenderedFragment)await Renderer.RenderFragment(renderFragment);
}
- private IRenderedComponent RenderWithRenderFragment(RenderFragment renderFragment)
+ private async Task> RenderWithRenderFragment(RenderFragment renderFragment)
where TComponent : IComponent
{
- var res = (IRenderedFragment)Renderer.RenderFragment(renderFragment);
+ var res = (IRenderedFragment)await Renderer.RenderFragment(renderFragment);
return res.FindComponent();
}
@@ -239,70 +239,70 @@ public void Test031()
}
[Fact(DisplayName = "ChildContent can be passed as a nested component parameter builder")]
- public void Test032()
+ public async Task Test032()
{
Builder.AddChildContent(parameters => parameters.Add(p => p.ValueTypeParam, 42));
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("ChildContent", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Instance.ValueTypeParam.ShouldBe(42);
}
[Fact(DisplayName = "ChildContent can be passed as a child component without parameters")]
- public void Test033()
+ public async Task Test033()
{
Builder.AddChildContent();
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("ChildContent", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Instance.ShouldBeOfType();
}
[Fact(DisplayName = "ChildContent can be passed as a markup string")]
- public void Test034()
+ public async Task Test034()
{
var input = "
42
";
Builder.AddChildContent(input);
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("ChildContent", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Markup.ShouldBe(input);
}
[Fact(DisplayName = "RenderFragment can be passed as a nested component parameter builder")]
- public void Test040()
+ public async Task Test040()
{
Builder.Add(x => x.OtherFragment, parameters => parameters.Add(p => p.ValueTypeParam, 42));
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("OtherFragment", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Instance.ValueTypeParam.ShouldBe(42);
}
[Fact(DisplayName = "RenderFragment can be passed as a child component without parameters")]
- public void Test041()
+ public async Task Test041()
{
Builder.Add(x => x.OtherFragment);
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("OtherFragment", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Instance.ShouldBeOfType();
}
[Fact(DisplayName = "RenderFragment can be passed as a markup string")]
- public void Test042()
+ public async Task Test042()
{
var input = "
42
";
Builder.Add(x => x.OtherFragment, input);
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter("OtherFragment", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Markup.ShouldBe(input);
}
@@ -318,18 +318,22 @@ public void Test043()
}
[Fact(DisplayName = "RenderFragment can be passed multiple times")]
- public void Test044()
+ public async Task Test044()
{
var input = "FOO";
Builder.Add(x => x.OtherFragment, input);
Builder.Add(x => x.OtherFragment, b => b.AddMarkupContent(0, input));
- Builder.Build().ShouldAllBe(VerifyTemplate, VerifyTemplate);
+ foreach (var item in Builder.Build())
+ {
+ await VerifyTemplate(item);
+ await VerifyTemplate(item);
+ }
- void VerifyTemplate(ComponentParameter template)
+ async Task VerifyTemplate(ComponentParameter template)
{
var actual = template.ShouldBeParameter("OtherFragment", isCascadingValue: false);
- var actualComponent = RenderWithRenderFragment(actual);
+ var actualComponent = await RenderWithRenderFragment(actual);
actualComponent.Markup.ShouldBe(input);
}
}
@@ -346,19 +350,19 @@ public void Test050()
}
[Fact(DisplayName = "RenderFragment? can be passed lambda builder")]
- public void Test051()
+ public async Task Test051()
{
var input = "FOO";
Builder.Add(x => x.Template, value => value);
var actual = Builder.Build().ShouldHaveSingleItem()
.ShouldBeParameter