@@ -285,6 +285,23 @@ public void CopyConstructor_CopiesModelStateData()
285
285
Assert . Equal ( entry . ValidationState , actual . ValidationState ) ;
286
286
}
287
287
288
+ [ Fact ]
289
+ public void TryAddModelException_Succeeds ( )
290
+ {
291
+ // Arrange
292
+ var dictionary = new ModelStateDictionary ( ) ;
293
+ var exception = new TestException ( ) ;
294
+
295
+ // Act
296
+ dictionary . TryAddModelException ( "some key" , exception ) ;
297
+
298
+ // Assert
299
+ var kvp = Assert . Single ( dictionary ) ;
300
+ Assert . Equal ( "some key" , kvp . Key ) ;
301
+ var error = Assert . Single ( kvp . Value . Errors ) ;
302
+ Assert . Same ( exception , error . Exception ) ;
303
+ }
304
+
288
305
[ Fact ]
289
306
public void AddModelErrorCreatesModelStateIfNotPresent ( )
290
307
{
@@ -695,13 +712,15 @@ public void AddModelError_WithErrorString_AddsTooManyModelErrors_WhenMaxErrorsIs
695
712
} ;
696
713
var provider = new EmptyModelMetadataProvider ( ) ;
697
714
var metadata = provider . GetMetadataForProperty ( typeof ( string ) , nameof ( string . Length ) ) ;
715
+
716
+ // Act
698
717
dictionary . AddModelError ( "key1" , "error1" ) ;
699
718
dictionary . AddModelError ( "key2" , new Exception ( ) , metadata ) ;
700
719
dictionary . AddModelError ( "key3" , new Exception ( ) , metadata ) ;
701
720
dictionary . AddModelError ( "key4" , "error4" ) ;
702
721
dictionary . AddModelError ( "key5" , "error5" ) ;
703
722
704
- // Act and Assert
723
+ // Assert
705
724
Assert . True ( dictionary . HasReachedMaxErrors ) ;
706
725
Assert . Equal ( 5 , dictionary . ErrorCount ) ;
707
726
var error = Assert . Single ( dictionary [ string . Empty ] . Errors ) ;
@@ -712,6 +731,35 @@ public void AddModelError_WithErrorString_AddsTooManyModelErrors_WhenMaxErrorsIs
712
731
Assert . DoesNotContain ( "key5" , dictionary . Keys ) ;
713
732
}
714
733
734
+ [ Fact ]
735
+ public void TryAddModelException_ReturnsFalse_AndAddsMaxModelErrorMessage ( )
736
+ {
737
+ // Arrange
738
+ var expected = "The maximum number of allowed model errors has been reached." ;
739
+ var dictionary = new ModelStateDictionary
740
+ {
741
+ MaxAllowedErrors = 3
742
+ } ;
743
+
744
+ // Act and Assert
745
+ var result = dictionary . TryAddModelError ( "key1" , "error1" ) ;
746
+ Assert . True ( result ) ;
747
+
748
+ result = dictionary . TryAddModelException ( "key2" , new Exception ( ) ) ;
749
+ Assert . True ( result ) ;
750
+
751
+ result = dictionary . TryAddModelException ( "key3" , new Exception ( ) ) ;
752
+ Assert . False ( result ) ;
753
+
754
+ Assert . Equal ( 3 , dictionary . Count ) ;
755
+ var error = Assert . Single ( dictionary [ string . Empty ] . Errors ) ;
756
+ Assert . IsType < TooManyModelErrorsException > ( error . Exception ) ;
757
+ Assert . Equal ( expected , error . Exception . Message ) ;
758
+
759
+ // TooManyModelErrorsException added instead of key3 exception.
760
+ Assert . DoesNotContain ( "key3" , dictionary . Keys ) ;
761
+ }
762
+
715
763
[ Fact ]
716
764
public void TryAddModelError_WithErrorString_ReturnsFalse_AndAddsMaxModelErrorMessage ( )
717
765
{
@@ -864,6 +912,21 @@ public void ModelStateDictionary_HasReachedMaxErrors(int errorCount, bool expect
864
912
Assert . Equal ( expected , canAdd ) ;
865
913
}
866
914
915
+ [ Fact ]
916
+ public void ModelStateDictionary_ReturnExceptionMessage_WhenModelStateNotSet ( )
917
+ {
918
+ // Arrange
919
+ var dictionary = new ModelStateDictionary ( ) ;
920
+ var exception = new FormatException ( "The supplied value is invalid for Length." ) ;
921
+
922
+ // Act
923
+ dictionary . TryAddModelException ( "key" , exception ) ;
924
+
925
+ // Assert
926
+ var error = Assert . Single ( dictionary [ "key" ] . Errors ) ;
927
+ Assert . Same ( exception , error . Exception ) ;
928
+ }
929
+
867
930
[ Fact ]
868
931
public void ModelStateDictionary_ReturnGenericErrorMessage_WhenModelStateNotSet ( )
869
932
{
@@ -933,6 +996,22 @@ public void ModelStateDictionary_AddsCustomErrorMessage_WhenModelStateNotSet_Wit
933
996
Assert . Equal ( expected , error . ErrorMessage ) ;
934
997
}
935
998
999
+ [ Fact ]
1000
+ public void TryAddModelException_ReturnExceptionMessage_WhenModelStateSet ( )
1001
+ {
1002
+ // Arrange
1003
+ var dictionary = new ModelStateDictionary ( ) ;
1004
+ dictionary . SetModelValue ( "key" , new string [ ] { "some value" } , "some value" ) ;
1005
+ var exception = new FormatException ( "The value 'some value' is not valid for Length." ) ;
1006
+
1007
+ // Act
1008
+ dictionary . TryAddModelException ( "key" , exception ) ;
1009
+
1010
+ // Assert
1011
+ var error = Assert . Single ( dictionary [ "key" ] . Errors ) ;
1012
+ Assert . Same ( exception , error . Exception ) ;
1013
+ }
1014
+
936
1015
[ Fact ]
937
1016
public void ModelStateDictionary_ReturnSpecificErrorMessage_WhenModelStateSet ( )
938
1017
{
@@ -1022,6 +1101,23 @@ public void ModelStateDictionary_NoErrorMessage_ForUnrecognizedException()
1022
1101
Assert . Empty ( error . ErrorMessage ) ;
1023
1102
}
1024
1103
1104
+ [ Fact ]
1105
+ public void TryAddModelException_AddsErrorMessage_ForInputFormatterException ( )
1106
+ {
1107
+ // Arrange
1108
+ var dictionary = new ModelStateDictionary ( ) ;
1109
+ var exception = new InputFormatterException ( "This is an InputFormatterException." ) ;
1110
+
1111
+ // Act
1112
+ dictionary . TryAddModelException ( "key" , exception ) ;
1113
+
1114
+ // Assert
1115
+ var entry = Assert . Single ( dictionary ) ;
1116
+ Assert . Equal ( "key" , entry . Key ) ;
1117
+ var error = Assert . Single ( entry . Value . Errors ) ;
1118
+ Assert . Same ( exception , error . Exception ) ;
1119
+ }
1120
+
1025
1121
[ Fact ]
1026
1122
public void ModelStateDictionary_AddsErrorMessage_ForInputFormatterException ( )
1027
1123
{
@@ -1371,4 +1467,14 @@ private class OptionsAccessor : IOptions<MvcOptions>
1371
1467
public MvcOptions Value { get ; } = new MvcOptions ( ) ;
1372
1468
}
1373
1469
}
1470
+
1471
+ internal class TestException : Exception
1472
+ {
1473
+ public TestException ( )
1474
+ {
1475
+ Message = "This is a test exception" ;
1476
+ }
1477
+
1478
+ public override string Message { get ; }
1479
+ }
1374
1480
}
0 commit comments