Fix failures in StringOutputFormatter functional tests

The missing piece here is is that StringOutputFormatter needs to set the
ContentType so that it gets overridden. The problem is that the formatter
is likely called with something like application/json, but decides to
write a string anyway. So because we're saying 'yes we can write' we also
need to override what we're writing.
This commit is contained in:
Ryan Nowak 2015-10-20 22:12:21 -07:00
parent 55b72c04bf
commit 800e46eed4
2 changed files with 10 additions and 7 deletions

View File

@ -31,13 +31,9 @@ namespace Microsoft.AspNet.Mvc.Formatters
// Ignore the passed in content type, if the object is string // Ignore the passed in content type, if the object is string
// always return it as a text/plain format. // always return it as a text/plain format.
if (context.ObjectType == typeof(string)) if (context.ObjectType == typeof(string) || context.Object is string)
{
return true;
}
if (context.Object is string)
{ {
context.ContentType = SupportedMediaTypes[0];
return true; return true;
} }

View File

@ -7,6 +7,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNet.Http; using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Internal;
using Microsoft.Net.Http.Headers;
using Moq; using Moq;
using Xunit; using Xunit;
@ -20,7 +21,6 @@ namespace Microsoft.AspNet.Mvc.Formatters
{ {
// object value, bool useDeclaredTypeAsString, bool expectedCanWriteResult // object value, bool useDeclaredTypeAsString, bool expectedCanWriteResult
yield return new object[] { "valid value", true, true }; yield return new object[] { "valid value", true, true };
yield return new object[] { "valid value", false, true };
yield return new object[] { null, true, true }; yield return new object[] { null, true, true };
yield return new object[] { null, false, false }; yield return new object[] { null, false, false };
yield return new object[] { new object(), false, false }; yield return new object[] { new object(), false, false };
@ -35,15 +35,22 @@ namespace Microsoft.AspNet.Mvc.Formatters
bool expectedCanWriteResult) bool expectedCanWriteResult)
{ {
// Arrange // Arrange
var expectedContentType = expectedCanWriteResult ?
MediaTypeHeaderValue.Parse("text/plain") :
MediaTypeHeaderValue.Parse("application/json");
var formatter = new StringOutputFormatter(); var formatter = new StringOutputFormatter();
var type = useDeclaredTypeAsString ? typeof(string) : typeof(object); var type = useDeclaredTypeAsString ? typeof(string) : typeof(object);
var context = new OutputFormatterWriteContext(new DefaultHttpContext(), type, value); var context = new OutputFormatterWriteContext(new DefaultHttpContext(), type, value);
context.ContentType = MediaTypeHeaderValue.Parse("application/json");
// Act // Act
var result = formatter.CanWriteResult(context); var result = formatter.CanWriteResult(context);
// Assert // Assert
Assert.Equal(expectedCanWriteResult, result); Assert.Equal(expectedCanWriteResult, result);
Assert.Equal(expectedContentType, context.ContentType);
} }
[Fact] [Fact]