Модульный тест C # не удается сохранить изображение на сервере, но приложение работает нормально - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сохранить изображение из веб-ссылки в папку локального проекта ASP.Net "~ Content / Images"

Первоначально я сохранял изображение так:

imgUrl = "http://example.com/myimage.jpg";
imgName = Path.GetFileName(imgUrl);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
System.Drawing.Image img = System.Drawing.Image.FromStream(response.GetResponseStream());
img.Save(Server.MapPath("~/Content/Images/" + imgName));

Но мой модульный тест не удался с NullReferenceException на Server object в Server.MapPath() методе.

Затем я попробовал другой способ сохранить изображение.

imgUrl = "http://example.com/myimage.jpg";
imgName = Path.GetFileName(imgUrl);

byte[] data;

using (WebClient client = new WebClient())
   data = client.DownloadData(imgUrl);

  if (data != null)
  {
   MemoryStream ioStream = new MemoryStream();
   ioStream = new MemoryStream(data);

    using (Stream originalBinaryDataStream = ioStream)
    {
     var path = System.IO.Path.Combine("~/Content/Images/" + imgName);
     Image image = Image.FromStream(originalBinaryDataStream);                                    
     image.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);                                    
    }
  }

Но модульный тест снова не удался.На этот раз с System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. ошибка.

Кстати, приложение работает нормально.Эта проблема возникает только когда я запускаю модульные тесты.

У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Когда объект Bitmap или объект Image создается из файла, файл остается заблокированным на время существования объекта.В результате вы не можете изменить изображение и сохранить его обратно в тот же файл, в котором оно было создано.http://support.microsoft.com/?id=814675

Вы можете попробовать это:

imgUrl = "http://example.com/myimage.jpg";
imgName = Path.GetFileName(imgUrl);

byte[] data;

using (WebClient client = new WebClient())
    data = client.DownloadData(imgUrl);

if (data != null)
{
    using (MemoryStream ioStream = new MemoryStream(data))
    {
        var path = System.IO.Path.Combine("~/Content/Images/" + imgName);
        var fromStream = Image.FromStream(ioStream);
        Image image = new Bitmap(fromStream);
        fromStream.Dispose();
        using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
        {
            image.Save(ioStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] bytes = ioStream.ToArray();
            fs.Write(bytes, 0, bytes.Length);
        }

    }

}
0 голосов
/ 19 сентября 2018

В ваших юнит-тестах вам придётся подделать или Mock HttpContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...