Skip to content

Commit ddd5e32

Browse files
Stuart HealeyStuart Healey
Stuart Healey
authored and
Stuart Healey
committed
Added StatusCodeResultAssertions and tests
1 parent 56286e0 commit ddd5e32

7 files changed

+178
-18
lines changed

src/FluentAssertions.AspNetCore.Mvc/ActionResultAssertions.cs

+28
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,34 @@ public RedirectToActionResultAssertions BeRedirectToActionResult(string reason,
228228
return new RedirectToActionResultAssertions(Subject as RedirectToActionResult);
229229
}
230230

231+
/// <summary>
232+
/// Asserts that the subject is a <see cref="StatusCodeResult"/>.
233+
/// </summary>
234+
public StatusCodeResultAssertions BeStatusCodeResult()
235+
{
236+
return BeStatusCodeResult(string.Empty, null);
237+
}
238+
239+
/// <summary>
240+
/// Asserts that the subject is a <see cref="StatusCodeResult"/>.
241+
/// </summary>
242+
/// <param name="reason">
243+
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
244+
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
245+
/// </param>
246+
/// <param name="reasonArgs">
247+
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
248+
/// </param>
249+
public StatusCodeResultAssertions BeStatusCodeResult(string reason, params object[] reasonArgs)
250+
{
251+
Execute.Assertion
252+
.BecauseOf(reason, reasonArgs)
253+
.ForCondition(Subject is StatusCodeResult)
254+
.FailWith(Constants.CommonFailMessage, "StatusCodeResult", Subject.GetType().Name);
255+
256+
return new StatusCodeResultAssertions(Subject as StatusCodeResult);
257+
}
258+
231259
#endregion Public Methods
232260

233261
#region Public Structs

src/FluentAssertions.AspNetCore.Mvc/FailureMessages.Designer.cs

+26-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/FluentAssertions.AspNetCore.Mvc/FailureMessages.resx

+3
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@
138138
<data name="RouteData_Values_HaveValue" xml:space="preserve">
139139
<value>Expected RouteData.Values[{0}] to have value {1}, but found {2}.</value>
140140
</data>
141+
<data name="StatusCodeResultBase_WithStatusCode" xml:space="preserve">
142+
<value>Expected status code to be {0} but found {1}.</value>
143+
</data>
141144
<data name="ViewResultBase_NullModel" xml:space="preserve">
142145
<value>Expected Model to be of type {0}, but no Model was supplied.</value>
143146
</data>

src/FluentAssertions.AspNetCore.Mvc/FluentAssertions.AspNetCore.Mvc.csproj

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<Description>Fluent Assertions extensions for ASP.NET Core MVC.</Description>
@@ -29,4 +29,19 @@
2929
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0" />
3030
</ItemGroup>
3131

32+
<ItemGroup>
33+
<Compile Update="FailureMessages.Designer.cs">
34+
<DesignTime>True</DesignTime>
35+
<AutoGen>True</AutoGen>
36+
<DependentUpon>FailureMessages.resx</DependentUpon>
37+
</Compile>
38+
</ItemGroup>
39+
40+
<ItemGroup>
41+
<EmbeddedResource Update="FailureMessages.resx">
42+
<Generator>PublicResXFileCodeGenerator</Generator>
43+
<LastGenOutput>FailureMessages.Designer.cs</LastGenOutput>
44+
</EmbeddedResource>
45+
</ItemGroup>
46+
3247
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using FluentAssertions.Execution;
2+
using FluentAssertions.Primitives;
3+
using Microsoft.AspNetCore.Mvc;
4+
5+
namespace FluentAssertions.AspNetCore.Mvc
6+
{
7+
public class StatusCodeResultAssertions : ObjectAssertions
8+
{
9+
/// <summary>
10+
/// Initializes a new instance of the <see cref="T:StatusCodeResultAssertions" /> class.
11+
/// </summary>
12+
/// <param name="subject">The object to test assertion on</param>
13+
public StatusCodeResultAssertions(StatusCodeResult subject) : base(subject)
14+
{
15+
}
16+
17+
private StatusCodeResult StatusCodeResultSubject => (StatusCodeResult) Subject;
18+
19+
/// <summary>
20+
/// The model.
21+
/// </summary>
22+
public int StatusCode => StatusCodeResultSubject.StatusCode;
23+
24+
/// <summary>
25+
/// Asserts that the status code is the expected status code.
26+
/// </summary>
27+
/// <param name="expectedStatusCode">The status code.</param>
28+
/// <param name="reason">
29+
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
30+
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
31+
/// </param>
32+
/// <param name="reasonArgs">
33+
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
34+
/// </param>
35+
public StatusCodeResultAssertions WithStatusCode(int expectedStatusCode, string reason = "", params object[] reasonArgs)
36+
{
37+
Execute.Assertion
38+
.ForCondition(StatusCode == expectedStatusCode)
39+
.BecauseOf(reason, reasonArgs)
40+
.FailWith(FailureMessages.StatusCodeResultBase_WithStatusCode, expectedStatusCode, StatusCode);
41+
return this;
42+
}
43+
}
44+
}

tests/FluentAssertions.AspNetCore.Mvc.Tests/ActionResultAssertions_Tests.cs

+16
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,22 @@ public void BeView_GivenNotView_ShouldFail()
106106
.WithMessage("Expected ActionResult to be \"ViewResult\", but found \"RedirectResult\"");
107107
}
108108

109+
[Fact]
110+
public void BeStatusCodeResult_GivenStatusCodeResult_ShouldPass()
111+
{
112+
ActionResult result = new StatusCodeResult(200);
113+
result.Should().BeStatusCodeResult();
114+
}
115+
116+
[Fact]
117+
public void BeStatusCodeResult_GivenNotStatusCodeResult_ShouldFail()
118+
{
119+
ActionResult result = new RedirectResult("/");
120+
Action a = () => result.Should().BeStatusCodeResult();
121+
a.Should().Throw<Exception>()
122+
.WithMessage("Expected ActionResult to be \"StatusCodeResult\", but found \"RedirectResult\"");
123+
}
124+
109125
#endregion Public Methods
110126
}
111127
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using FluentAssertions.Mvc.Tests.Fakes;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System;
4+
using Xunit;
5+
6+
namespace FluentAssertions.AspNetCore.Mvc.Tests
7+
{
8+
public class StatusCodeResultAssertions_Tests
9+
{
10+
#region Private Fields
11+
12+
private FakeController _controller = new FakeController();
13+
14+
#endregion Private Fields
15+
16+
#region Public Methods
17+
18+
[Fact]
19+
public void WithStatusCode_GivenExpectedValue_ShouldPass()
20+
{
21+
int statusCode = 200;
22+
23+
ActionResult result = new StatusCodeResult(statusCode);
24+
25+
result.Should().BeStatusCodeResult().WithStatusCode(statusCode);
26+
}
27+
28+
[Fact]
29+
public void WithStatusCode_GivenUnexpectedValue_ShouldFail()
30+
{
31+
int actualStatusCode = 200;
32+
int expectedStatusCode = 400;
33+
34+
var failureMessage = string.Format(FailureMessages.StatusCodeResultBase_WithStatusCode, expectedStatusCode, actualStatusCode);
35+
ActionResult result = new StatusCodeResult(actualStatusCode);
36+
37+
Action action = () => result.Should().BeStatusCodeResult().WithStatusCode(expectedStatusCode);
38+
39+
action.Should().Throw<Exception>()
40+
.WithMessage(failureMessage);
41+
}
42+
43+
#endregion Public Methods
44+
}
45+
}

0 commit comments

Comments
 (0)