Skip to content

Commit cc85008

Browse files
committed
Fixed incorrect behavior when action return type is ActionResult<T> (closes #359)
1 parent 1f5a211 commit cc85008

2 files changed

Lines changed: 50 additions & 14 deletions

File tree

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
using Builders.Base;
88
using Builders.Contracts.Results;
99
using Builders.Results;
10-
using Exceptions;
1110
using Internal.TestContexts;
1211
using Microsoft.AspNetCore.Mvc;
12+
using Utilities;
1313
using Utilities.Validators;
1414

1515
/// <summary>
1616
/// Contains model extension methods for <see cref="IBaseShouldReturnTestBuilder"/>.
1717
/// </summary>
1818
public static class BaseShouldReturnTestBuilderExtensions
1919
{
20+
private static readonly Type ActionResultGenericType = typeof(ActionResult<>);
21+
private static readonly Type ObjectResultType = typeof(ObjectResult);
22+
2023
/// <summary>
2124
/// Tests whether the result is of the provided type.
2225
/// </summary>
@@ -45,7 +48,7 @@ public static IAndTestBuilder ResultOfType<TResult>(
4548
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
4649

4750
InvocationResultValidator.ValidateInvocationResultType(
48-
actualBuilder.TestContext,
51+
ConvertMethodResult(actualBuilder.TestContext),
4952
resultType,
5053
canBeAssignable: true,
5154
allowDifferentGenericTypeDefinitions: true);
@@ -79,7 +82,7 @@ public static IAndTestBuilder ResultOfType<TResult>(
7982
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
8083

8184
InvocationResultValidator.ValidateInvocationResultType<TResult>(
82-
actualBuilder.TestContext,
85+
ConvertMethodResult(actualBuilder.TestContext),
8386
canBeAssignable: true);
8487

8588
resultTestBuilder?.Invoke(new ResultDetailsTestBuilder<TResult>(actualBuilder.TestContext));
@@ -99,7 +102,9 @@ public static IAndTestBuilder Result(
99102
{
100103
var actualBuilder = (BaseTestBuilderWithActionContext)builder;
101104

102-
resultTestBuilder?.Invoke(new ResultDetailsTestBuilder(actualBuilder.TestContext));
105+
var convertedTestContext = ConvertMethodResult(actualBuilder.TestContext);
106+
107+
resultTestBuilder?.Invoke(new ResultDetailsTestBuilder(convertedTestContext));
103108

104109
return new AndTestBuilder(actualBuilder.TestContext);
105110
}
@@ -120,20 +125,18 @@ public static IAndTestBuilder Result<TResult>(
120125

121126
private static ActionTestContext ConvertMethodResult(ActionTestContext testContext)
122127
{
123-
var methodResult = testContext.MethodResult;
128+
var methodReturnType = testContext.Method.ReturnType;
124129

125-
if (methodResult is IActionResult)
130+
if (Reflection.AreAssignableByGeneric(ActionResultGenericType, methodReturnType))
126131
{
127-
if (methodResult is ObjectResult objectResult)
128-
{
129-
testContext.MethodResult = objectResult.Value;
130-
}
131-
else
132+
var methodResultType = testContext.MethodResult.GetType();
133+
134+
if (Reflection.AreSameTypes(ObjectResultType, methodResultType))
132135
{
133-
throw new InvocationResultAssertionException("Test");
134-
}
136+
var objectResult = testContext.MethodResult as ObjectResult;
135137

136-
return testContext;
138+
testContext.MethodResult = objectResult?.Value;
139+
}
137140
}
138141

139142
return testContext;

test/MyTested.AspNetCore.Mvc.Models.Test/BuildersTests/ActionsTests/ShouldReturnTests/ShouldReturnTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,28 @@ public void AnonymousResultShouldBeProperlyRecognized()
556556
});
557557
}
558558

559+
[Fact]
560+
public void ObjectResultShouldBeProperlyRecognized()
561+
{
562+
MyController<MvcController>
563+
.Instance()
564+
.Calling(c => c.ObjectResultWithResponse())
565+
.ShouldReturn()
566+
.ResultOfType<ObjectResult>(result => result
567+
.Passing(obj => obj.Value is List<ResponseModel>));
568+
}
569+
570+
[Fact]
571+
public void ObjectResultChildrenShouldBeProperlyRecognized()
572+
{
573+
MyController<MvcController>
574+
.Instance()
575+
.Calling(c => c.OkResultWithResponse())
576+
.ShouldReturn()
577+
.ResultOfType<OkObjectResult>(result => result
578+
.Passing(obj => obj.Value is List<ResponseModel>));
579+
}
580+
559581
[Fact]
560582
public void AnonymousResultShouldBeProperlyRecognizedAndShouldThrowException()
561583
{
@@ -614,6 +636,17 @@ public void ActionResultOfTShouldBeProperlyRecognizedWithObjectActionResultAndMo
614636
}));
615637
}
616638

639+
[Fact]
640+
public void ActionResultOfTShouldBeProperlyRecognizedWithOkResultAndResultChain()
641+
{
642+
MyController<MvcController>
643+
.Instance()
644+
.Calling(c => c.ActionResultOfT(int.MaxValue))
645+
.ShouldReturn()
646+
.ResultOfType<OkObjectResult>(result => result
647+
.Passing(ok => ok.Value is ResponseModel));
648+
}
649+
617650
[Fact]
618651
public void ActionResultOfTShouldBeProperlyRecognizedWithModelOfGenericType()
619652
{

0 commit comments

Comments
 (0)