1010using System . Threading . Tasks ;
1111using Microsoft . AspNet . Http ;
1212using Microsoft . AspNet . Mvc . ModelBinding ;
13+ using Microsoft . Extensions . Logging ;
1314using Moq ;
1415using Newtonsoft . Json ;
1516using Newtonsoft . Json . Serialization ;
@@ -34,7 +35,9 @@ public class JsonInputFormatterTest
3435 public void CanRead_ReturnsTrueForAnySupportedContentType ( string requestContentType , bool expectedCanRead )
3536 {
3637 // Arrange
37- var formatter = new JsonInputFormatter ( ) ;
38+ var loggerMock = GetLogger ( ) ;
39+
40+ var formatter = new JsonInputFormatter ( loggerMock ) ;
3841 var contentBytes = Encoding . UTF8 . GetBytes ( "content" ) ;
3942
4043 var httpContext = GetHttpContext ( contentBytes , contentType : requestContentType ) ;
@@ -58,7 +61,8 @@ public void CanRead_ReturnsTrueForAnySupportedContentType(string requestContentT
5861 public void DefaultMediaType_ReturnsApplicationJson ( )
5962 {
6063 // Arrange
61- var formatter = new JsonInputFormatter ( ) ;
64+ var loggerMock = GetLogger ( ) ;
65+ var formatter = new JsonInputFormatter ( loggerMock ) ;
6266
6367 // Act
6468 var mediaType = formatter . SupportedMediaTypes [ 0 ] ;
@@ -83,7 +87,8 @@ public static IEnumerable<object[]> JsonFormatterReadSimpleTypesData
8387 public async Task JsonFormatterReadsSimpleTypes ( string content , Type type , object expected )
8488 {
8589 // Arrange
86- var formatter = new JsonInputFormatter ( ) ;
90+ var logger = GetLogger ( ) ;
91+ var formatter = new JsonInputFormatter ( logger ) ;
8792 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
8893
8994 var httpContext = GetHttpContext ( contentBytes ) ;
@@ -109,7 +114,8 @@ public async Task JsonFormatterReadsComplexTypes()
109114 {
110115 // Arrange
111116 var content = "{name: 'Person Name', Age: '30'}" ;
112- var formatter = new JsonInputFormatter ( ) ;
117+ var logger = GetLogger ( ) ;
118+ var formatter = new JsonInputFormatter ( logger ) ;
113119 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
114120
115121 var httpContext = GetHttpContext ( contentBytes ) ;
@@ -137,7 +143,8 @@ public async Task ReadAsync_AddsModelValidationErrorsToModelState()
137143 {
138144 // Arrange
139145 var content = "{name: 'Person Name', Age: 'not-an-age'}" ;
140- var formatter = new JsonInputFormatter ( ) ;
146+ var logger = GetLogger ( ) ;
147+ var formatter = new JsonInputFormatter ( logger ) ;
141148 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
142149
143150 var modelState = new ModelStateDictionary ( ) ;
@@ -166,7 +173,8 @@ public async Task ReadAsync_InvalidArray_AddsOverflowErrorsToModelState()
166173 {
167174 // Arrange
168175 var content = "[0, 23, 300]" ;
169- var formatter = new JsonInputFormatter ( ) ;
176+ var logger = GetLogger ( ) ;
177+ var formatter = new JsonInputFormatter ( logger ) ;
170178 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
171179
172180 var modelState = new ModelStateDictionary ( ) ;
@@ -187,14 +195,22 @@ public async Task ReadAsync_InvalidArray_AddsOverflowErrorsToModelState()
187195 Assert . True ( result . HasError ) ;
188196 Assert . Equal ( "The supplied value is invalid for Byte." , modelState [ "[2]" ] . Errors [ 0 ] . ErrorMessage ) ;
189197 Assert . Null ( modelState [ "[2]" ] . Errors [ 0 ] . Exception ) ;
198+ Mock . Get < ILogger > ( logger ) . Verify ( l => l . Log (
199+ LogLevel . Verbose ,
200+ It . IsAny < int > ( ) ,
201+ It . IsAny < object > ( ) ,
202+ It . IsAny < Exception > ( ) ,
203+ It . IsAny < Func < object , Exception , string > > ( ) ) ,
204+ Times . Once ) ;
190205 }
191206
192207 [ Fact ]
193208 public async Task ReadAsync_InvalidComplexArray_AddsOverflowErrorsToModelState ( )
194209 {
195210 // Arrange
196211 var content = "[{name: 'Name One', Age: 30}, {name: 'Name Two', Small: 300}]" ;
197- var formatter = new JsonInputFormatter ( ) ;
212+ var logger = GetLogger ( ) ;
213+ var formatter = new JsonInputFormatter ( logger ) ;
198214 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
199215
200216 var modelState = new ModelStateDictionary ( ) ;
@@ -216,14 +232,22 @@ public async Task ReadAsync_InvalidComplexArray_AddsOverflowErrorsToModelState()
216232 Assert . Equal (
217233 "Error converting value 300 to type 'System.Byte'. Path '[1].Small', line 1, position 59." ,
218234 modelState [ "names[1].Small" ] . Errors [ 0 ] . Exception . Message ) ;
235+ Mock . Get < ILogger > ( logger ) . Verify ( l => l . Log (
236+ LogLevel . Verbose ,
237+ It . IsAny < int > ( ) ,
238+ It . IsAny < object > ( ) ,
239+ It . IsAny < Exception > ( ) ,
240+ It . IsAny < Func < object , Exception , string > > ( ) ) ,
241+ Times . Once ) ;
219242 }
220243
221244 [ Fact ]
222245 public async Task ReadAsync_UsesTryAddModelValidationErrorsToModelState ( )
223246 {
224247 // Arrange
225248 var content = "{name: 'Person Name', Age: 'not-an-age'}" ;
226- var formatter = new JsonInputFormatter ( ) ;
249+ var logger = GetLogger ( ) ;
250+ var formatter = new JsonInputFormatter ( logger ) ;
227251 var contentBytes = Encoding . UTF8 . GetBytes ( content ) ;
228252
229253 var modelState = new ModelStateDictionary ( ) ;
@@ -249,14 +273,23 @@ public async Task ReadAsync_UsesTryAddModelValidationErrorsToModelState()
249273 Assert . False ( modelState . ContainsKey ( "age" ) ) ;
250274 var error = Assert . Single ( modelState [ "" ] . Errors ) ;
251275 Assert . IsType < TooManyModelErrorsException > ( error . Exception ) ;
276+ Mock . Get < ILogger > ( logger ) . Verify ( l => l . Log (
277+ It . IsAny < LogLevel > ( ) ,
278+ It . IsAny < int > ( ) ,
279+ It . IsAny < object > ( ) ,
280+ It . IsAny < Exception > ( ) ,
281+ It . IsAny < Func < object , Exception , string > > ( ) ) ,
282+ Times . Once ) ;
252283 }
253284
254285 [ Fact ]
255286 public void Creates_SerializerSettings_ByDefault ( )
256287 {
257288 // Arrange
289+ var logger = GetLogger ( ) ;
290+
258291 // Act
259- var jsonFormatter = new JsonInputFormatter ( ) ;
292+ var jsonFormatter = new JsonInputFormatter ( logger ) ;
260293
261294 // Assert
262295 Assert . NotNull ( jsonFormatter . SerializerSettings ) ;
@@ -266,9 +299,11 @@ public void Creates_SerializerSettings_ByDefault()
266299 public void Constructor_UsesSerializerSettings ( )
267300 {
268301 // Arrange
302+ var logger = GetLogger ( ) ;
303+
269304 // Act
270305 var serializerSettings = new JsonSerializerSettings ( ) ;
271- var jsonFormatter = new JsonInputFormatter ( serializerSettings ) ;
306+ var jsonFormatter = new JsonInputFormatter ( logger , serializerSettings ) ;
272307
273308 // Assert
274309 Assert . Same ( serializerSettings , jsonFormatter . SerializerSettings ) ;
@@ -280,8 +315,8 @@ public async Task ChangesTo_DefaultSerializerSettings_TakesEffect()
280315 // Arrange
281316 // missing password property here
282317 var contentBytes = Encoding . UTF8 . GetBytes ( "{ \" UserName\" : \" John\" }" ) ;
283-
284- var jsonFormatter = new JsonInputFormatter ( ) ;
318+ var logger = GetLogger ( ) ;
319+ var jsonFormatter = new JsonInputFormatter ( logger ) ;
285320 // by default we ignore missing members, so here explicitly changing it
286321 jsonFormatter . SerializerSettings . MissingMemberHandling = MissingMemberHandling . Error ;
287322
@@ -313,8 +348,8 @@ public async Task CustomSerializerSettingsObject_TakesEffect()
313348 // Arrange
314349 // missing password property here
315350 var contentBytes = Encoding . UTF8 . GetBytes ( "{ \" UserName\" : \" John\" }" ) ;
316-
317- var jsonFormatter = new JsonInputFormatter ( ) ;
351+ var logger = GetLogger ( ) ;
352+ var jsonFormatter = new JsonInputFormatter ( logger ) ;
318353 // by default we ignore missing members, so here explicitly changing it
319354 jsonFormatter . SerializerSettings = new JsonSerializerSettings ( )
320355 {
@@ -343,6 +378,20 @@ public async Task CustomSerializerSettingsObject_TakesEffect()
343378 Assert . Contains ( "Required property 'Password' not found in JSON" , modelErrorMessage ) ;
344379 }
345380
381+ private static ILogger GetLogger ( )
382+ {
383+ var logger = new Mock < ILogger > ( ) ;
384+ logger . Setup ( l => l . Log (
385+ LogLevel . Verbose ,
386+ It . IsAny < int > ( ) ,
387+ It . IsAny < object > ( ) ,
388+ It . IsAny < Exception > ( ) ,
389+ It . IsAny < Func < object , Exception , string > > ( ) ) ) ;
390+ logger . Setup ( l => l . IsEnabled ( LogLevel . Verbose ) ) . Returns ( true ) ;
391+
392+ return logger . Object ;
393+ }
394+
346395 private static HttpContext GetHttpContext (
347396 byte [ ] contentBytes ,
348397 string contentType = "application/json" )
0 commit comments