Skip to content

Commit b5af60e

Browse files
committed
Added .ShouldReturn().ActionResult<TResult>() assertion chain for action results (#359)
1 parent f829415 commit b5af60e

5 files changed

Lines changed: 103 additions & 9 deletions

File tree

src/MyTested.AspNetCore.Mvc.Abstractions/Utilities/Extensions/TupleExtensions.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@ public static (string, string) GetTypeComparisonNames(this (Type Expected, Type
99
var expected = typeTuple.Expected;
1010
var actual = typeTuple.Actual;
1111

12-
var useFullName = expected?.Name == actual?.Name;
12+
var expectedName = expected?.ToFriendlyTypeName();
13+
var actualName = actual?.ToFriendlyTypeName();
1314

14-
return (expected.ToFriendlyTypeName(useFullName), actual.ToFriendlyTypeName(useFullName));
15+
if (expectedName == actualName)
16+
{
17+
return (expected.ToFriendlyTypeName(true), actual.ToFriendlyTypeName(true));
18+
}
19+
20+
return (expectedName, actualName);
1521
}
1622
}
1723
}

src/MyTested.AspNetCore.Mvc.Abstractions/Utilities/Validators/InvocationResultValidator.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ public static void ValidateInvocationResultType(
3939
public static void ValidateInvocationResultType<TExpectedType>(
4040
ComponentTestContext testContext,
4141
bool canBeAssignable = false,
42-
bool allowDifferentGenericTypeDefinitions = false)
43-
=> ValidateInvocationResultType(testContext, typeof(TExpectedType), canBeAssignable, allowDifferentGenericTypeDefinitions);
42+
bool allowDifferentGenericTypeDefinitions = false,
43+
Type typeOfActualReturnValue = null)
44+
=> ValidateInvocationResultType(
45+
testContext,
46+
typeof(TExpectedType),
47+
canBeAssignable,
48+
allowDifferentGenericTypeDefinitions,
49+
typeOfActualReturnValue);
4450

4551
public static void ValidateInvocationResultTypes(
4652
ComponentTestContext testContext,

src/MyTested.AspNetCore.Mvc.Controllers/Builders/Actions/ShouldReturn/ShouldReturnActionResultTestBuilder.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
/// </summary>
1414
/// <typeparam name="TActionResult">Result from invoked action in ASP.NET Core MVC controller.</typeparam>
1515
public class ShouldReturnActionResultTestBuilder<TActionResult>
16-
: ShouldReturnTestBuilder<TActionResult>, IShouldReturnActionResultTestBuilder<TActionResult>
16+
: ShouldReturnTestBuilder<TActionResult>,
17+
IShouldReturnActionResultTestBuilder<TActionResult>
1718
{
1819
private static readonly Type ActionResultType = typeof(IActionResult);
1920
private static readonly Type GenericActionResultType = typeof(ActionResult<>);
@@ -45,6 +46,15 @@ IAndTestBuilder IShouldReturnActionResultTestBuilder<TActionResult>.ActionResult
4546
return new AndTestBuilder(this.TestContext);
4647
}
4748

49+
IAndTestBuilder IShouldReturnActionResultTestBuilder<TActionResult>.ActionResult<TResult>()
50+
{
51+
InvocationResultValidator.ValidateInvocationResultType<ActionResult<TResult>>(
52+
this.TestContext,
53+
typeOfActualReturnValue: this.TestContext.Method.ReturnType);
54+
55+
return new AndTestBuilder(this.TestContext);
56+
}
57+
4858
private void ValidateActionResults()
4959
=> InvocationResultValidator.ValidateInvocationResultTypes(
5060
this.TestContext,

src/MyTested.AspNetCore.Mvc.Controllers/Builders/Contracts/Actions/IShouldReturnActionResultTestBuilder.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,22 @@ public interface IShouldReturnActionResultTestBuilder<TActionResult>
1818
/// <returns>Test builder of <see cref="IAndTestBuilder"/> type.</returns>
1919
IAndTestBuilder ActionResult();
2020

21+
/// <summary>
2122
/// Tests whether the action result is <see cref="Microsoft.AspNetCore.Mvc.IActionResult"/>,
2223
/// <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> or
2324
/// <see cref="Microsoft.AspNetCore.Mvc.ActionResult{TResult}"/>.
25+
/// </summary>
2426
/// <param name="actionResultTestBuilder">Test builder which asserts the actual action result.</param>
2527
/// <returns>Test builder of <see cref="IAndTestBuilder"/> type.</returns>
2628
IAndTestBuilder ActionResult(Action<IShouldReturnTestBuilder<TActionResult>> actionResultTestBuilder);
2729

28-
//// ActionResult<TResult>, consider OkResult for example to be valid too?
29-
//IAndTestBuilder ActionResult<TResult>();
30+
/// <summary>
31+
/// Tests whether the action result is
32+
/// <see cref="Microsoft.AspNetCore.Mvc.ActionResult{TResult}"/>.
33+
/// </summary>
34+
/// <typeparam name="TResult">Type of the expected result.</typeparam>
35+
/// <returns>Test builder of <see cref="IAndTestBuilder"/> type.</returns>
36+
IAndTestBuilder ActionResult<TResult>();
3037

3138
//// ActionResult<TResult>, consider OkResult for example to be valid too? with additional options to specify the result - Ok() for example
3239
//IAndTestBuilder ActionResult<TResult>(Action<IShouldReturnTestBuilder<TActionResult>> actionResultTestBuilder);

test/MyTested.AspNetCore.Mvc.Controllers.Test/BuildersTests/ActionsTests/ShouldReturnTests/ShouldReturnActionResultTests.cs

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void ShouldReturnActionResultShouldNotThrowExceptionWhenResultIsIActionRe
1919
}
2020

2121
[Fact]
22-
public void ShouldReturnActionResultShouldNotThrowExceptionWhenResultIsIActionResultBaseClass()
22+
public void ShouldReturnActionResultShouldNotThrowExceptionWhenResultIsActionResultBaseClass()
2323
{
2424
MyController<MvcController>
2525
.Instance()
@@ -66,7 +66,7 @@ public void ShouldReturnActionResultWithDetailsShouldNotThrowExceptionWhenResult
6666
}
6767

6868
[Fact]
69-
public void ShouldReturnActionResultWithDetailsShouldNotThrowExceptionWhenResultIsIActionResultBaseClass()
69+
public void ShouldReturnActionResultWithDetailsShouldNotThrowExceptionWhenResultIsActionResultBaseClass()
7070
{
7171
MyController<MvcController>
7272
.Instance()
@@ -104,5 +104,70 @@ public void ShouldReturnActionResultWithDetailsShouldThrowExceptionWhenWhenResul
104104
},
105105
"When calling BadRequestAction action in MvcController expected result to be OkResult, but instead received BadRequestResult.");
106106
}
107+
108+
[Fact]
109+
public void ShouldReturnActionResultOfTShouldNotThrowExceptionWhenResultIsActionResultOfTWithActionResult()
110+
{
111+
MyController<MvcController>
112+
.Instance()
113+
.Calling(c => c.ActionResultOfT(0))
114+
.ShouldReturn()
115+
.ActionResult<ResponseModel>();
116+
}
117+
118+
[Fact]
119+
public void ShouldReturnActionResultOfTShouldNotThrowExceptionWhenResultIsActionResultOfTWithModel()
120+
{
121+
MyController<MvcController>
122+
.Instance()
123+
.Calling(c => c.ActionResultOfT(1))
124+
.ShouldReturn()
125+
.ActionResult<ResponseModel>();
126+
}
127+
128+
[Fact]
129+
public void ShouldReturnActionResultOfTShouldThrowExceptionWhenResultIsIActionResultInterface()
130+
{
131+
Test.AssertException<InvocationResultAssertionException>(
132+
() =>
133+
{
134+
MyController<MvcController>
135+
.Instance()
136+
.Calling(c => c.ActionResultInterface())
137+
.ShouldReturn()
138+
.ActionResult<ResponseModel>();
139+
},
140+
"When calling ActionResultInterface action in MvcController expected result to be ActionResult<ResponseModel>, but instead received IActionResult.");
141+
}
142+
143+
[Fact]
144+
public void ShouldReturnActionResultOfTShouldThrowExceptionWhenResultIsActionResultBaseClass()
145+
{
146+
Test.AssertException<InvocationResultAssertionException>(
147+
() =>
148+
{
149+
MyController<MvcController>
150+
.Instance()
151+
.Calling(c => c.ActionResultBaseClass())
152+
.ShouldReturn()
153+
.ActionResult<ResponseModel>();
154+
},
155+
"When calling ActionResultBaseClass action in MvcController expected result to be ActionResult<ResponseModel>, but instead received ActionResult.");
156+
}
157+
158+
[Fact]
159+
public void ShouldReturnActionResultOfTShouldThrowExceptionWhenResultIsActionResultOfWrongModel()
160+
{
161+
Test.AssertException<InvocationResultAssertionException>(
162+
() =>
163+
{
164+
MyController<MvcController>
165+
.Instance()
166+
.Calling(c => c.ActionResultOfT(0))
167+
.ShouldReturn()
168+
.ActionResult<RequestModel>();
169+
},
170+
"When calling ActionResultOfT action in MvcController expected result to be ActionResult<RequestModel>, but instead received ActionResult<ResponseModel>.");
171+
}
107172
}
108173
}

0 commit comments

Comments
 (0)