-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbunit-generators.html
More file actions
217 lines (191 loc) · 9.9 KB
/
Copy pathbunit-generators.html
File metadata and controls
217 lines (191 loc) · 9.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>bUnit Generators | bUnit </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="bUnit Generators | bUnit ">
<meta name="description" content="bUnit is a unit testing library for Blazor Components. You can easily define components under test in C# or Razor syntax and verify outcome using semantic HTML diffing/comparison logic. You can interact with and inspect components, trigger event handlers, provide cascading values, inject services, mock IJsRuntime, and perform snapshot testing.">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<link rel="manifest" href="/site.webmanifest">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<meta name="docfx:rel" content="../../">
<meta name="docfx:docurl" content="https://github.com/bUnit-dev/bUnit/blob/stable/docs/site/docs/extensions/bunit-generators.md/#L1">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for "{query}"">
<meta name="loc:searchNoResults" content="No results for "{query}"">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
</head>
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../..//images/bunit-logo.png" alt="bUnit">
bUnit
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled="" placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" style="margin-top: -.65em; margin-left: -.8em" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="bunit-generators">
<h1 id="bunit-generators">bUnit Generators</h1>
<p>The <code>bunit.generators</code> package contains a set of source generators that can be used to generate code likes stubs for Blazor components. The generators are designed to be used with the <a href="https://github.com/bunit-dev/bunit">bUnit</a> testing framework for Blazor components. To use the generators, you must install the <code>bunit.generators</code> NuGet package in test project.</p>
<p>This page will describe the generators and their usage.</p>
<h2 id="component-stub-generator-via-addstub">Component stub generator via <code>AddStub</code></h2>
<p>This generator adds the ability to automatically generate stubs for a given type with no setup involved. The generator sits on top of the already
present <code>AddStub</code> method.
This comes in handy, when dealing with 3rd party components that might need an extensive setup. Here a small example:</p>
<p>Given the following component</p>
<pre><code class="lang-razor"><ThirdPartyText Text="@count" />
<button @onclick="IncrementCount">Increase by one</button>
@code {
private int count;
private void IncrementCount()
{
count++;
}
}
</code></pre>
<p>If <code>ThirdPartyText</code> is a 3rd party component, that needs a lot of setup, it might be easier to just stub it out:</p>
<pre><code class="lang-csharp">[Fact]
public void Text_button_gets_initial_count()
{
// This call will automatically generate a stub for the ThirdPartyButton component
// with the name "ThirdPartyButtonStub"
ComponentFactories.AddStub<ThirdPartyText>();
var cut = Render<Counter>(@<Counter />);
cut.Find("button").Click();
// Retrieves the stub from the render tree and checks if the text is "1"
cut.FindComponent<ThirdPartyTextStub>().Instance.Text.Should().Be("1");
}
</code></pre>
<h3 id="setup">Setup</h3>
<p>To use the generator, the <strong>Interceptor</strong> feature has to be used inside the csproj file:</p>
<pre><code class="lang-xml"><Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!-- This line is required to enable the generator and interceptor -->
<InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Bunit</InterceptorsPreviewNamespaces>
</code></pre>
<p>Due to the usage of <strong>Interceptors</strong> the generator is only available for .NET 8.0 and above. The generator does create a <code>partial</code> class, so it can be extended with custom logic if needed.</p>
<h2 id="component-stub-generator-via-componentstubattribute">Component stub generator via <code>ComponentStubAttribute</code></h2>
<p>This generator adds the ability to automatically generate stubs for a given type via an attribute.
The general setup for the given component above looks like this:</p>
<pre><code class="lang-csharp">namespace MyTest;
public class FeatureTests : BunitContext
{
[Fact]
public void Test()
{
ComponentFactories.Add<ThirdPartyText, ThirdPartyStub>();
...
}
}
[ComponentStub<ThirdPartyText>]
internal partial class ThirdPartyStub { }
</code></pre>
<p>Current limitations of this approach is that he stubbed type is not allowed to be nested inside the test class.</p>
<h2 id="reported-diagnostics">Reported Diagnostics</h2>
<p>The generators will report a range of diagnostics to help understanding what issue is present. The following table shows the diagnostics that are reported.</p>
<table>
<thead>
<tr>
<th>Diagnostic ID</th>
<th>Error</th>
<th>Severity</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>BUNIT0001</td>
<td>Stubbing nested classes ({0}) is not supported.</td>
<td>Warning</td>
<td>Types annotated with <code>ComponentStub</code> can not be nested inside another class.</td>
</tr>
<tr>
<td>BUNIT0002</td>
<td>Class ({0}) is not partial.</td>
<td>Warning</td>
<td>Types annotated with <code>ComponentStub</code> must be partial.</td>
</tr>
</tbody>
</table>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/bUnit-dev/bUnit/blob/stable/docs/site/docs/extensions/bunit-generators.md/#L1" class="edit-link">Edit this page</a>
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
<div class="border-top text-center pt-4">
<a class="d-block" href="https://dotnetfoundation.org" title=".NET Foundation">
<img width="150" src="/sponsors/dotnetfoundation_v4_purple.svg" alt=".NET Foundation">
</a>
<p class="pt-1"><small>Supported by the <a href="https://dotnetfoundation.org">.NET Foundation</a>.</small></p>
</div>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary bg-body-tertiary">
<div class="container-xxl">
<div class="flex-fill">
<small>Documentation updated on 2026-04-30T07:37:06.0000000+00:00 in commit 2003898efa</small>
</div>
</div>
</footer>
</body>
</html>