Skip to content

Commit ca4f839

Browse files
committed
Tested all new methods for the .ActionResult<TResult> assertion chain (#359)
1 parent 677e03b commit ca4f839

File tree

4 files changed

+97
-28
lines changed

4 files changed

+97
-28
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
namespace MyTested.AspNetCore.Mvc.Utilities.Extensions
2+
{
3+
using System;
4+
using Internal.TestContexts;
5+
using Microsoft.AspNetCore.Mvc;
6+
7+
public static class ActionTestContextExtensions
8+
{
9+
private static readonly Type ActionResultGenericType = typeof(ActionResult<>);
10+
private static readonly Type ObjectResultType = typeof(ObjectResult);
11+
12+
public static ActionTestContext ConvertMethodResult(this ActionTestContext testContext)
13+
{
14+
var methodReturnType = testContext.Method.ReturnType;
15+
16+
if (Reflection.AreAssignableByGeneric(ActionResultGenericType, methodReturnType))
17+
{
18+
var methodResultType = testContext.MethodResult.GetType();
19+
20+
if (Reflection.AreSameTypes(ObjectResultType, methodResultType))
21+
{
22+
var objectResult = testContext.MethodResult as ObjectResult;
23+
24+
testContext.MethodResult = objectResult?.Value;
25+
}
26+
}
27+
28+
return testContext;
29+
}
30+
}
31+
}

src/MyTested.AspNetCore.Mvc.Controllers/Builders/ActionResults/ActionResult/ActionResultOfTTestBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Builders.Base;
44
using Contracts.ActionResults.ActionResult;
55
using Internal.TestContexts;
6+
using Utilities.Extensions;
67

78
/// <summary>
89
/// Used for testing <see cref="Microsoft.AspNetCore.Mvc.ActionResult{TResult}"/>.
@@ -21,6 +22,7 @@ public class ActionResultOfTTestBuilder<TResult>
2122
public ActionResultOfTTestBuilder(ControllerTestContext testContext)
2223
: base(testContext)
2324
{
25+
testContext.ConvertMethodResult();
2426
}
2527

2628
/// <inheritdoc />

src/MyTested.AspNetCore.Mvc.Models/BaseShouldReturnTestBuilderExtensions.cs

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,14 @@
77
using Builders.Base;
88
using Builders.Contracts.Results;
99
using Builders.Results;
10-
using Internal.TestContexts;
11-
using Microsoft.AspNetCore.Mvc;
12-
using Utilities;
10+
using Utilities.Extensions;
1311
using Utilities.Validators;
1412

1513
/// <summary>
1614
/// Contains model extension methods for <see cref="IBaseShouldReturnTestBuilder"/>.
1715
/// </summary>
1816
public static class BaseShouldReturnTestBuilderExtensions
1917
{
20-
private static readonly Type ActionResultGenericType = typeof(ActionResult<>);
21-
private static readonly Type ObjectResultType = typeof(ObjectResult);
22-
2318
/// <summary>
2419
/// Tests whether the result is of the provided type.
2520
/// </summary>
@@ -48,7 +43,7 @@ public static IAndTestBuilder ResultOfType<TResult>(
4843
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
4944

5045
InvocationResultValidator.ValidateInvocationResultType(
51-
ConvertMethodResult(actualBuilder.TestContext),
46+
actualBuilder.TestContext.ConvertMethodResult(),
5247
resultType,
5348
canBeAssignable: true,
5449
allowDifferentGenericTypeDefinitions: true);
@@ -82,7 +77,7 @@ public static IAndTestBuilder ResultOfType<TResult>(
8277
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
8378

8479
InvocationResultValidator.ValidateInvocationResultType<TResult>(
85-
ConvertMethodResult(actualBuilder.TestContext),
80+
actualBuilder.TestContext.ConvertMethodResult(),
8681
canBeAssignable: true);
8782

8883
resultTestBuilder?.Invoke(new ResultDetailsTestBuilder<TResult>(actualBuilder.TestContext));
@@ -102,7 +97,7 @@ public static IAndTestBuilder Result(
10297
{
10398
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
10499

105-
var convertedTestContext = ConvertMethodResult(actualBuilder.TestContext);
100+
var convertedTestContext = actualBuilder.TestContext.ConvertMethodResult();
106101

107102
resultTestBuilder?.Invoke(new ResultDetailsTestBuilder(convertedTestContext));
108103

@@ -122,24 +117,5 @@ public static IAndTestBuilder Result<TResult>(
122117
=> builder
123118
.Result(value => value
124119
.EqualTo(result));
125-
126-
private static ActionTestContext ConvertMethodResult(ActionTestContext testContext)
127-
{
128-
var methodReturnType = testContext.Method.ReturnType;
129-
130-
if (Reflection.AreAssignableByGeneric(ActionResultGenericType, methodReturnType))
131-
{
132-
var methodResultType = testContext.MethodResult.GetType();
133-
134-
if (Reflection.AreSameTypes(ObjectResultType, methodResultType))
135-
{
136-
var objectResult = testContext.MethodResult as ObjectResult;
137-
138-
testContext.MethodResult = objectResult?.Value;
139-
}
140-
}
141-
142-
return testContext;
143-
}
144120
}
145121
}

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Setups.Controllers;
77
using Setups.Models;
88
using Xunit;
9+
using Xunit.Sdk;
910

1011
public class ShouldReturnActionResultTests
1112
{
@@ -258,6 +259,65 @@ public void ShouldReturnActionResultOfTWithDetailsShouldThrowExceptionWhenResult
258259
"When calling ActionResultOfT action in MvcController expected result to be ActionResult<RequestModel>, but instead received ActionResult<ResponseModel>.");
259260
}
260261

262+
[Fact]
263+
public void ShouldReturnActionResultOfTWithResultDetailsShouldNotThrowExceptionWhenResultIsActionResultOfTWithCorrectResult()
264+
{
265+
MyController<MvcController>
266+
.Instance()
267+
.Calling(c => c.ActionResultOfT(1))
268+
.ShouldReturn()
269+
.ActionResult<ResponseModel>(result => result
270+
.Passing(model => model.IntegerValue == 1));
271+
}
272+
273+
[Fact]
274+
public void ShouldReturnActionResultOfTWithResultDetailsShouldThrowExceptionWhenResultIsActionResultOfTWithIncorrectResult()
275+
{
276+
Test.AssertException<InvocationResultAssertionException>(
277+
() =>
278+
{
279+
MyController<MvcController>
280+
.Instance()
281+
.Calling(c => c.ActionResultOfT(1))
282+
.ShouldReturn()
283+
.ActionResult<ResponseModel>(result => result
284+
.Passing(model => model.IntegerValue == 2));
285+
},
286+
"When calling ActionResultOfT action in MvcController expected the ResponseModel to pass the given predicate, but it failed.");
287+
}
288+
289+
[Fact]
290+
public void ShouldReturnActionResultOfTWithResultDetailsShouldNotThrowExceptionWhenResultIsActionResultOfTWithCorrectAssertion()
291+
{
292+
MyController<MvcController>
293+
.Instance()
294+
.Calling(c => c.ActionResultOfT(1))
295+
.ShouldReturn()
296+
.ActionResult<ResponseModel>(result => result
297+
.Passing(model =>
298+
{
299+
Assert.True(model.IntegerValue == 1);
300+
}));
301+
}
302+
303+
[Fact]
304+
public void ShouldReturnActionResultOfTWithResultDetailsShouldThrowExceptionWhenResultIsActionResultOfTWithIncorrectAssertion()
305+
{
306+
Assert.Throws<TrueException>(
307+
() =>
308+
{
309+
MyController<MvcController>
310+
.Instance()
311+
.Calling(c => c.ActionResultOfT(1))
312+
.ShouldReturn()
313+
.ActionResult<ResponseModel>(result => result
314+
.Passing(model =>
315+
{
316+
Assert.True(model.IntegerValue == 2);
317+
}));
318+
});
319+
}
320+
261321
[Fact]
262322
public void ShouldReturnActionResultShouldWorkCorrectlyWithShouldPassFotTheMethod()
263323
{

0 commit comments

Comments
 (0)