Skip to content

Commit 8a2b028

Browse files
committed
Removed dependency on Shouldly by creating a custom xUnit exception
1 parent bcf5a71 commit 8a2b028

13 files changed

+230
-172
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.29123.89
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A5D7B605-02D8-468C-9BDF-864CF93B12F9}"
7+
ProjectSection(SolutionItems) = preProject
8+
LICENSE = LICENSE
9+
README.md = README.md
10+
EndProjectSection
11+
EndProject
12+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E006E9A4-F554-46DF-838F-812956521F64}"
13+
EndProject
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{C929375E-BD70-4B78-88C1-BDD1623C3365}"
15+
EndProject
16+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Egil.RazorComponents.Testing.Library", "src\Egil.RazorComponents.Testing.Library.csproj", "{AA96790B-67C9-4141-ACDB-037C8DC092EC}"
17+
EndProject
18+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Egil.RazorComponents.Testing.Library.Tests", "tests\Egil.RazorComponents.Testing.Library.Tests\Egil.RazorComponents.Testing.Library.Tests.csproj", "{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9}"
19+
EndProject
20+
Global
21+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
22+
Debug|Any CPU = Debug|Any CPU
23+
Release|Any CPU = Release|Any CPU
24+
EndGlobalSection
25+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
26+
{AA96790B-67C9-4141-ACDB-037C8DC092EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27+
{AA96790B-67C9-4141-ACDB-037C8DC092EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
28+
{AA96790B-67C9-4141-ACDB-037C8DC092EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
29+
{AA96790B-67C9-4141-ACDB-037C8DC092EC}.Release|Any CPU.Build.0 = Release|Any CPU
30+
{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
31+
{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
32+
{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
33+
{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9}.Release|Any CPU.Build.0 = Release|Any CPU
34+
EndGlobalSection
35+
GlobalSection(SolutionProperties) = preSolution
36+
HideSolutionNode = FALSE
37+
EndGlobalSection
38+
GlobalSection(NestedProjects) = preSolution
39+
{AA96790B-67C9-4141-ACDB-037C8DC092EC} = {E006E9A4-F554-46DF-838F-812956521F64}
40+
{1FA13D3B-9AD6-4253-A373-BEFE6B5B70A9} = {C929375E-BD70-4B78-88C1-BDD1623C3365}
41+
EndGlobalSection
42+
GlobalSection(ExtensibilityGlobals) = postSolution
43+
SolutionGuid = {24106918-1C86-4769-BDA6-9C80E64CD260}
44+
EndGlobalSection
45+
EndGlobal

sample/RazorComponentLibTests/AlertTests.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ and re-render, use the component reference syntax and the Render method.
9797
// initial assert
9898
var result = RenderResults.Single(x => x.Id == (nameof(DismissTest)));
9999
result.RenderedHtml.ShouldBe(result.Snippets[0]);
100-
sut.Visible.ShouldBeTrue();
100+
Assert.Equal(true, sut.Visible);
101101

102102
// act
103103
isVisible = false;
@@ -106,7 +106,7 @@ and re-render, use the component reference syntax and the Render method.
106106
// dismiss assert
107107
var dismissResult = RenderResults.Single(x => x.Id == (nameof(DismissTest)));
108108
dismissResult.RenderedHtml.ShouldBe(result.Snippets[1]);
109-
sut.Visible.ShouldBeFalse();
109+
Assert.Equal(false, sut.Visible);
110110
}
111111
}
112112
<Fact Id=@nameof(DismissTest)>

sample/RazorComponentLibTests/RazorComponentLibTests.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
<PackageReference Include="Microsoft.AspNetCore.Components" Version="3.0.0-preview7.19365.7" />
1111
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
1212
<PackageReference Include="Moq" Version="4.12.0" />
13-
<PackageReference Include="Razor.Components.Testing.Library" Version="0.1.0-preview7-19365-7-1" />
14-
<PackageReference Include="xunit" Version="2.4.1" />
13+
<PackageReference Include="Razor.Components.Testing.Library" Version="0.1.0-preview7-19365-7-2" />
14+
<PackageReference Include="xunit.assert" Version="2.4.1" />
15+
<PackageReference Include="xunit.core" Version="2.4.1" />
1516
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
1617
<PrivateAssets>all</PrivateAssets>
1718
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

sample/RazorComponentLibTests/_Imports.razor

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,4 @@
44
@using Microsoft.JSInterop
55
@using Xunit
66
@using Moq
7-
@using Shouldly
87
@using Egil.RazorComponents.Testing
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Linq;
3+
using System.Text;
4+
using System.Xml;
5+
using Org.XmlUnit.Diff;
6+
using Xunit.Sdk;
7+
8+
namespace Egil.RazorComponents.Testing
9+
{
10+
public class RazorComponentDoesNotMatchException : AssertActualExpectedException
11+
{
12+
public RazorComponentDoesNotMatchException(XmlNode expectedHtml, XmlNode renderedHtml, Diff diffResult)
13+
: base(PrettyXml(expectedHtml),
14+
PrettyXml(renderedHtml),
15+
CreateDiffMessage(diffResult),
16+
"Expected HTML",
17+
"Rendered HTML")
18+
{
19+
}
20+
21+
private static string CreateDiffMessage(Diff diffResult)
22+
{
23+
var diffs = diffResult.Differences.ToArray();
24+
var result = new StringBuilder();
25+
result.AppendLine();
26+
result.AppendLine($"Found {diffs.Length} differences between expected HTML and rendered HTML:");
27+
28+
for (int i = 0; i < diffs.Length; i++)
29+
{
30+
result.AppendLine($"{i + 1}) {diffs[i].ToString()}");
31+
}
32+
33+
return result.ToString();
34+
}
35+
36+
private static string PrettyXml(XmlNode? xml)
37+
{
38+
if (xml is null) return string.Empty;
39+
40+
var result = new StringBuilder();
41+
var settings = new XmlWriterSettings
42+
{
43+
OmitXmlDeclaration = true,
44+
Indent = true,
45+
NewLineOnAttributes = false,
46+
ConformanceLevel = ConformanceLevel.Fragment,
47+
IndentChars = " ",
48+
};
49+
50+
using (var xmlWriter = XmlWriter.Create(result, settings))
51+
{
52+
xml.WriteTo(xmlWriter);
53+
}
54+
55+
result.Insert(0, Environment.NewLine);
56+
result.AppendLine();
57+
58+
return result.ToString();
59+
}
60+
}
61+
}

src/Diffing/ShouldlyRazorComponentTestExtensions.cs

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Xml;
2+
using Org.XmlUnit;
3+
using Org.XmlUnit.Builder;
4+
using Org.XmlUnit.Diff;
5+
6+
namespace Egil.RazorComponents.Testing
7+
{
8+
9+
public static class XmlNodeAssertExtensions
10+
{
11+
public static void ShouldBe(this XmlNode renderedHtml, XmlNode expectedHtml)
12+
{
13+
var diffResult = CreateDiff(expectedHtml, renderedHtml);
14+
if (diffResult.HasDifferences())
15+
throw new RazorComponentDoesNotMatchException(expectedHtml.FirstChild, renderedHtml.FirstChild, diffResult);
16+
}
17+
18+
private static Diff CreateDiff(XmlNode control, XmlNode test)
19+
{
20+
var controlSource = Input.FromNode(control.FirstChild).Build();
21+
var testSource = Input.FromNode(test.FirstChild).Build();
22+
return CreateDiff(controlSource, testSource);
23+
}
24+
25+
public static Diff CreateDiff(ISource control, ISource test)
26+
{
27+
return DiffBuilder.Compare(control)
28+
.IgnoreWhitespace()
29+
.WithTest(test)
30+
.WithDifferenceEvaluator(DifferenceEvaluators.Chain(
31+
DifferenceEvaluators.Default,
32+
RegexAttributeDifferenceEvaluator.Default,
33+
CssClassAttributeDifferenceEvaluator.Default)
34+
)
35+
.Build();
36+
}
37+
}
38+
}

src/razor-component-testing-library.csproj renamed to src/Egil.RazorComponents.Testing.Library.csproj

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,25 @@
1111
<PackageId>Razor.Components.Testing.Library</PackageId>
1212
<PackageLicenseExpression></PackageLicenseExpression>
1313
<PackageLicenseFile>LICENSE</PackageLicenseFile>
14-
<RepositoryUrl>https://github.com/egil/razor-component-testing-library</RepositoryUrl>
15-
<PackageProjectUrl>https://github.com/egil/razor-component-testing-library</PackageProjectUrl>
14+
<RepositoryUrl>https://github.com/egil/razor-components-testing-library</RepositoryUrl>
15+
<PackageProjectUrl>https://github.com/egil/razor-components-testing-library</PackageProjectUrl>
1616
<PackageTags>razor-components unit-testing testing blazor blazor-server-side blazor-client-side</PackageTags>
17-
<Version>0.1.0-preview7-19365-7-1</Version>
17+
<Version>0.1.0-preview7-19365-7-2</Version>
1818
<Authors>Egil Hansen</Authors>
1919
<Company>Egil Hansen</Company>
2020
<Product>Razor Component Testing Library</Product>
21-
<Description>Testing library for Razor Components, that allows you to define your component under test and the expected output HTML in a .razor files.</Description>
21+
<Description>
22+
Testing library for Razor Components, that allows you to easily define your component under test and the expected output HTML in a .razor files. See the projects GitHub page for usage details: https://github.com/egil/razor-components-testing-library
23+
</Description>
2224
</PropertyGroup>
2325

2426
<ItemGroup>
2527
<PackageReference Include="Microsoft.AspNetCore.Components.Browser" Version="3.0.0-preview7.19365.7" />
2628
<PackageReference Include="Microsoft.AspNetCore.Components" Version="3.0.0-preview7.19365.7" />
2729
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
28-
<PackageReference Include="Shouldly" Version="3.0.2" />
2930
<PackageReference Include="System.Text.Encodings.Web" Version="4.6.0-preview7.19362.9" />
3031
<PackageReference Include="XMLUnit.Core" Version="2.7.1" />
32+
<PackageReference Include="xunit.assert" Version="2.4.1" />
3133
<PackageReference Include="xunit.extensibility.core" Version="2.4.1" />
3234
</ItemGroup>
3335

src/Fact.cs

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class Fact : ComponentBase
1919

2020
protected override void BuildRenderTree(RenderTreeBuilder builder)
2121
{
22-
if(ChildContent is null) throw new ArgumentNullException(nameof(ChildContent));
22+
if (ChildContent is null) throw new ArgumentNullException(nameof(ChildContent));
2323

2424
builder.OpenElement(0, ElementName);
2525

@@ -35,9 +35,11 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
3535
}
3636
}
3737

38-
public class TestSetup : ComponentBase
38+
public abstract class FactPart : ComponentBase
3939
{
40-
internal const string ElementName = "RenderedHtml";
40+
public const string WrapperElement = "Html";
41+
42+
protected abstract string GetElementName();
4143

4244
[Parameter]
4345
public RenderFragment? ChildContent { get; set; }
@@ -47,60 +49,34 @@ public class TestSetup : ComponentBase
4749

4850
protected override void BuildRenderTree(RenderTreeBuilder builder)
4951
{
50-
builder.OpenElement(0, ElementName);
52+
builder.OpenElement(0, GetElementName());
5153

5254
if (!string.IsNullOrEmpty(Id))
5355
builder.AddAttribute(1, nameof(Id), Id);
5456

55-
builder.AddContent(2, ChildContent);
57+
builder.OpenElement(10, WrapperElement);
58+
builder.AddContent(11, ChildContent);
59+
builder.CloseElement();
5660

5761
builder.CloseElement();
5862
}
5963
}
6064

61-
public class ExpectedHtml : ComponentBase
65+
public class TestSetup : FactPart
6266
{
63-
internal const string ElementName = "ExpectedHtml";
64-
65-
[Parameter]
66-
public RenderFragment? ChildContent { get; set; }
67-
68-
[Parameter]
69-
public string? Id { get; set; }
70-
71-
protected override void BuildRenderTree(RenderTreeBuilder builder)
72-
{
73-
builder.OpenElement(0, ElementName);
74-
75-
if (!string.IsNullOrEmpty(Id))
76-
builder.AddAttribute(1, nameof(Id), Id);
77-
78-
builder.AddContent(2, ChildContent);
79-
80-
builder.CloseElement();
81-
}
67+
public const string ElementName = "Rendered";
68+
protected override string GetElementName() => ElementName;
8269
}
8370

84-
public class HtmlSnippet : ComponentBase
71+
public class ExpectedHtml : FactPart
8572
{
86-
internal const string ElementName = "Html";
87-
88-
[Parameter]
89-
public RenderFragment? ChildContent { get; set; }
90-
91-
[Parameter]
92-
public string? Id { get; set; }
93-
94-
protected override void BuildRenderTree(RenderTreeBuilder builder)
95-
{
96-
builder.OpenElement(0, ElementName);
97-
98-
if (!string.IsNullOrEmpty(Id))
99-
builder.AddAttribute(1, nameof(Id), Id);
100-
101-
builder.AddContent(2, ChildContent);
73+
public const string ElementName = "Expected";
74+
protected override string GetElementName() => ElementName;
75+
}
10276

103-
builder.CloseElement();
104-
}
77+
public class HtmlSnippet : FactPart
78+
{
79+
public const string ElementName = "Snippet";
80+
protected override string GetElementName() => ElementName;
10581
}
10682
}

0 commit comments

Comments
 (0)