2

この単体テストが失敗する理由を理解するには、本当に助けが必要です。ストリームの処理方法が原因であると思われます。この自己ホスティング サーバーのセットアップをうまく使用するテストは他にもいくつかありますが、それらはすべて、文字列などのプリミティブを返すサービスを読み取ります。

問題のテストは次のとおりです。

using System.Net.Http;
using System.Threading;
using System.Web.Http.SelfHost;
using AttributeRouting.Web.Http.SelfHost;
using NUnit.Framework;

[TestFixture]
public class StreamControllerTests 
{
    [Test]
    public void Can_get_simple_streaming_service_to_respond()
    {
        using (var config = new HttpSelfHostConfiguration("http://in-memory"))
        {
            config.Routes.MapHttpAttributeRoutes();
            using (var server = new HttpSelfHostServer(config))
            {
                // I get the same behavior if I use HttpClient
                using (var client = new HttpMessageInvoker(server))
                {
                    using (var request = new HttpRequestMessage(HttpMethod.Get, "http://in-memory/stream/notepad"))
                    {
                        using (HttpResponseMessage response = client.SendAsync(request, CancellationToken.None).Result)
                        {
                            Assert.IsNotNull(response.Content);
                            // FAILS, content length is 0
                            Assert.Greater(response.Content.Headers.ContentLength, 0); 
                        }
                    }
                }
            }
        }

テストにフィードするコントローラーは次のとおりです。

using System;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using AttributeRouting.Web.Mvc;
using MyUnitTests.Properties;

[GET("stream/notepad")]
public HttpResponseMessage StreamAnImageFromResources()
{
    var imageStream = new MemoryStream(); // closed when stream content is read
    Resources.a_jpeg_in_resources.Save(imageStream, ImageFormat.Jpeg);
    try
    {                               
        HttpResponseMessage response = Request.CreateResponse();
        // at this point, imageStream contains about 120K bytes
        response.Content = new StreamContent(imageStream); 
        return response;            
    }
    catch (Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, e);
    }
}
4

1 に答える 1