Skip to content

Commit 269920c

Browse files
committed
Implemented content and HTML content results in ViewComponent testing (#66)
1 parent c8e2b9e commit 269920c

31 files changed

+319
-78
lines changed

src/MyTested.AspNetCore.Mvc.Abstractions/Exceptions/ResponseModelAssertionException.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
/// </summary>
88
public class ResponseModelAssertionException : Exception
99
{
10+
public static ResponseModelAssertionException From(string messagePrefix)
11+
=> new ResponseModelAssertionException($"{messagePrefix} the response model to be the given model, but in fact it was a different one.");
12+
1013
/// <summary>
1114
/// Initializes a new instance of the <see cref="ResponseModelAssertionException"/> class.
1215
/// </summary>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace MyTested.AspNetCore.Mvc.Internal
2+
{
3+
public class ExceptionMessageFormats
4+
{
5+
public const string ContentResult = "{0} content result to contain '{1}', but instead received '{2}'.";
6+
public const string ContentResultPredicate = "{0} content result ('{1}') to pass the given predicate, but it failed.";
7+
}
8+
}

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public static class InvocationResultValidator
99
{
10-
public static void ValidateInvocationReturnType(
10+
public static void ValidateInvocationResultType(
1111
ComponentTestContext testContext,
1212
Type typeOfExpectedReturnValue,
1313
bool canBeAssignable = false,
@@ -71,12 +71,31 @@ public static void ValidateInvocationReturnType(
7171
}
7272
}
7373

74-
public static void ValidateInvocationReturnType<TExpectedType>(
74+
public static void ValidateInvocationResultType<TExpectedType>(
7575
ComponentTestContext testContext,
7676
bool canBeAssignable = false,
7777
bool allowDifferentGenericTypeDefinitions = false)
7878
{
79-
ValidateInvocationReturnType(testContext, typeof(TExpectedType), canBeAssignable, allowDifferentGenericTypeDefinitions);
79+
ValidateInvocationResultType(testContext, typeof(TExpectedType), canBeAssignable, allowDifferentGenericTypeDefinitions);
80+
}
81+
82+
public static void ValidateInvocationResult<TResult>(ComponentTestContext testContext, TResult model)
83+
{
84+
ValidateInvocationResultType<TResult>(testContext);
85+
86+
if (Reflection.AreNotDeeplyEqual(model, testContext.MethodResult))
87+
{
88+
throw ResponseModelAssertionException.From(testContext.ExceptionMessagePrefix);
89+
}
90+
91+
testContext.Model = model;
92+
}
93+
94+
public static TResult GetInvocationResult<TResult>(ComponentTestContext testContext)
95+
where TResult : class
96+
{
97+
ValidateInvocationResultType<TResult>(testContext);
98+
return testContext.MethodResult as TResult;
8099
}
81100

82101
private static void ThrowNewInvocationResultAssertionException(

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using ActionResults.BadRequest;
44
using Contracts.ActionResults.BadRequest;
55
using Microsoft.AspNetCore.Mvc;
6+
using Utilities.Validators;
67

78
/// <content>
89
/// Class containing methods for testing <see cref="BadRequestResult"/> or <see cref="BadRequestObjectResult"/>.
@@ -23,7 +24,7 @@ public IBadRequestTestBuilder BadRequest()
2324
private IBadRequestTestBuilder ReturnBadRequestTestBuilder<TBadRequestResult>()
2425
where TBadRequestResult : ActionResult
2526
{
26-
this.TestContext.MethodResult = this.GetReturnObject<TBadRequestResult>();
27+
InvocationResultValidator.ValidateInvocationResultType<TBadRequestResult>(this.TestContext);
2728
return new BadRequestTestBuilder<TBadRequestResult>(this.TestContext);
2829
}
2930
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using ActionResults.Challenge;
44
using Contracts.ActionResults.Challenge;
55
using Microsoft.AspNetCore.Mvc;
6+
using Utilities.Validators;
67

78
/// <content>
89
/// Class containing methods for testing <see cref="ChallengeResult"/>.
@@ -12,7 +13,7 @@ public partial class ShouldReturnTestBuilder<TActionResult>
1213
/// <inheritdoc />
1314
public IChallengeTestBuilder Challenge()
1415
{
15-
this.TestContext.MethodResult = this.GetReturnObject<ChallengeResult>();
16+
InvocationResultValidator.ValidateInvocationResultType<ChallengeResult>(this.TestContext);
1617
return new ChallengeTestBuilder(this.TestContext);
1718
}
1819
}

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

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using Contracts.ActionResults.Content;
66
using Exceptions;
77
using Microsoft.AspNetCore.Mvc;
8-
using Utilities.Extensions;
8+
using Utilities.Validators;
99

1010
/// <content>
1111
/// Class containing methods for testing <see cref="ContentResult"/>.
@@ -15,34 +15,31 @@ public partial class ShouldReturnTestBuilder<TActionResult>
1515
/// <inheritdoc />
1616
public IContentTestBuilder Content()
1717
{
18-
this.TestContext.MethodResult = this.GetReturnObject<ContentResult>();
18+
InvocationResultValidator.ValidateInvocationResultType<ContentResult>(this.TestContext);
1919
return new ContentTestBuilder(this.TestContext);
2020
}
2121

2222
/// <inheritdoc />
2323
public IContentTestBuilder Content(string content)
2424
{
25-
var contentResult = this.GetReturnObject<ContentResult>();
25+
var contentResult = InvocationResultValidator.GetInvocationResult<ContentResult>(this.TestContext);
2626
var actualContent = contentResult.Content;
2727

2828
if (content != contentResult.Content)
2929
{
30-
throw new ContentResultAssertionException(string.Format(
31-
"When calling {0} action in {1} expected content result to contain '{2}', but instead received '{3}'.",
32-
this.ActionName,
33-
this.Controller.GetName(),
30+
throw ContentResultAssertionException.ForEquality(
31+
this.TestContext.ExceptionMessagePrefix,
3432
content,
35-
actualContent));
33+
actualContent);
3634
}
37-
38-
this.TestContext.MethodResult = contentResult;
35+
3936
return new ContentTestBuilder(this.TestContext);
4037
}
4138

4239
/// <inheritdoc />
4340
public IContentTestBuilder Content(Action<string> assertions)
4441
{
45-
var contentResult = this.GetReturnObject<ContentResult>();
42+
var contentResult = InvocationResultValidator.GetInvocationResult<ContentResult>(this.TestContext);
4643
var actualContent = contentResult.Content;
4744

4845
assertions(actualContent);
@@ -53,16 +50,14 @@ public IContentTestBuilder Content(Action<string> assertions)
5350
/// <inheritdoc />
5451
public IContentTestBuilder Content(Func<string, bool> predicate)
5552
{
56-
var contentResult = this.GetReturnObject<ContentResult>();
53+
var contentResult = InvocationResultValidator.GetInvocationResult<ContentResult>(this.TestContext);
5754
var actualContent = contentResult.Content;
5855

5956
if (!predicate(actualContent))
6057
{
61-
throw new ContentResultAssertionException(string.Format(
62-
"When calling {0} action in {1} expected content result ('{2}') to pass the given predicate, but it failed.",
63-
this.ActionName,
64-
this.Controller.GetName(),
65-
actualContent));
58+
throw ContentResultAssertionException.ForPredicate(
59+
this.TestContext.ExceptionMessagePrefix,
60+
actualContent);
6661
}
6762

6863
return new ContentTestBuilder(this.TestContext);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using ActionResults.Created;
44
using Contracts.ActionResults.Created;
55
using Microsoft.AspNetCore.Mvc;
6+
using Utilities.Validators;
67

78
/// <content>
89
/// Class containing methods for testing <see cref="CreatedResult"/>, <see cref="CreatedAtActionResult"/> or <see cref="CreatedAtRouteResult"/>.
@@ -28,7 +29,7 @@ public ICreatedTestBuilder Created()
2829
private ICreatedTestBuilder ReturnCreatedTestBuilder<TCreatedResult>()
2930
where TCreatedResult : ObjectResult
3031
{
31-
this.TestContext.MethodResult = this.GetReturnObject<TCreatedResult>();
32+
InvocationResultValidator.ValidateInvocationResultType<TCreatedResult>(this.TestContext);
3233
return new CreatedTestBuilder<TCreatedResult>(this.TestContext);
3334
}
3435
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public partial class ShouldReturnTestBuilder<TActionResult>
1212
/// <inheritdoc />
1313
public IBaseTestBuilderWithActionResult<TActionResult> Empty()
1414
{
15-
InvocationResultValidator.ValidateInvocationReturnType<EmptyResult>(this.TestContext);
15+
InvocationResultValidator.ValidateInvocationResultType<EmptyResult>(this.TestContext);
1616
return this.NewAndTestBuilderWithActionResult();
1717
}
1818
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using ActionResults.File;
44
using Contracts.ActionResults.File;
55
using Microsoft.AspNetCore.Mvc;
6+
using Utilities.Validators;
67

78
/// <content>
89
/// Class containing methods for testing <see cref="FileStreamResult"/>, <see cref="VirtualFileResult"/>, <see cref="FileContentResult"/> or <see cref="PhysicalFileResult"/>.
@@ -28,14 +29,14 @@ public IFileTestBuilder File()
2829
/// <inheritdoc />
2930
public IPhysicalFileTestBuilder PhysicalFile()
3031
{
31-
this.TestContext.MethodResult = this.GetReturnObject<PhysicalFileResult>();
32+
InvocationResultValidator.ValidateInvocationResultType<PhysicalFileResult>(this.TestContext);
3233
return new PhysicalFileTestBuilder(this.TestContext);
3334
}
3435

3536
private IFileTestBuilder ReturnFileTestBuilder<TFileResult>()
3637
where TFileResult : FileResult
3738
{
38-
this.TestContext.MethodResult = this.GetReturnObject<TFileResult>();
39+
InvocationResultValidator.ValidateInvocationResultType<TFileResult>(this.TestContext);
3940
return new FileTestBuilder<TFileResult>(this.TestContext);
4041
}
4142
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using ActionResults.Forbid;
44
using Contracts.ActionResults.Forbid;
55
using Microsoft.AspNetCore.Mvc;
6+
using Utilities.Validators;
67

78
/// <content>
89
/// Class containing methods for testing <see cref="ForbidResult"/>.
@@ -12,7 +13,7 @@ public partial class ShouldReturnTestBuilder<TActionResult>
1213
/// <inheritdoc />
1314
public IForbidTestBuilder Forbid()
1415
{
15-
this.TestContext.MethodResult = this.GetReturnObject<ForbidResult>();
16+
InvocationResultValidator.ValidateInvocationResultType<ForbidResult>(this.TestContext);
1617
return new ForbidTestBuilder(this.TestContext);
1718
}
1819
}

0 commit comments

Comments
 (0)