Когда экземпляр класса создается модульным тестом, исключение System.IO запускается для изображения в экземпляре класса - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть приложение Windows Form, которое работает без ошибок (во время компиляции создается .exe в bin \ debug вместе с папкой с именем «Images». Эта папка «Images» находится в папке с моим решением проекта и имеет значение «всегда копировать»).".

Когда код скомпилирован, все хорошо, и нет никаких исключений System.IO.

Однако, если этот класс, который ссылается на изображения, создается без компиляции и с помощью модуляВ тестовом ремне я вижу следующее:

System.Drawing.Image.FromFile (имя строки, логическое значение useEmbeddedColorManagement) в System.Drawing.Image.FromFile (имя строки) в YahtzeeApplication.GameBoard..ctor () вE: \ workspaces \ проекты визуальных студий \ Yahtzee \ YahtzeeApplication \ YahtzeeApplication \ GameBoard.cs: строка 124 в UnitTestProject.GameBoardTest.GameBoardElements () в E: \ workspaces \ проекты визуальных студий \ YahtzeestProject.Bject.Plication \ Game.Plication37 Сообщение о результате: System.IO.FileNotFoundException: Images \ 1.dice.GIF

Вот код, который загружает изображение:

diceImageArray[0] = Image.FromFile("Images\\1.dice.GIF");

Я видел, не тестовый класс или созданный экземпляр класс не видит изображения.но когда я поместил папку под названием «Изображения» в любом месте относительно вызова, ошибка не исчезла.

Что вы делаете для этого сценария в модульном тестировании?

1 Ответ

0 голосов
/ 17 декабря 2018

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

foo\bar\myprogram.exe

В общем, пользователь программы имеет контрольпо текущему каталогу.Плохо, когда программа меняет текущий каталог или полагается, что он настроен на какое-то конкретное местоположение ... например, местоположение выполняемой сборки.

Альтернативные способы определения местоположения каталога изображения зависят от того,путь определяется в вашем тесте или в тестируемом приложении.Если он находится в тесте, то у NUnit есть TestContext.TestDirectory, который является путем к каталогу, содержащему тестовую сборку.Если оно находится в самом приложении, то приложение должно быть закодировано таким образом, чтобы находить каталог изображений относительно определенного места, например, каталог, содержащий основную программу.Если вы укажете, где находится этот код, я могу дать более точное предложение.

Обновление - 22 января 2019

Использование относительного пути в пределахВаше приложение является слабым местом приложения, которое приведет к его отказу в определенных обстоятельствах, если у вас не будет полный контроль над текущими настройками каталога при каждом запуске программы.Запуск тестов под NUnit - это только одно из таких обстоятельств.IMO, вы должны изменить приложение так, чтобы оно находило изображения по пути относительно каталога, содержащего exe и , а не относительно текущего каталога.Это займет немного больше кода, но лучше, потому что это именно то, что вы собираетесь сделать.Ваши тесты делают вам одолжение, указав на эту проблему!

Вот некоторый код, который найдет изображения (см. Исключение ниже) относительно места сборки, которое выполняет загрузку изображений ...

string assemblyPath = GetType().Assembly.Location;
string assemblyDir = Path.GetDirectory(assemblyPath);
string imagePath = path.Combine(assemblyDir, "Images\\1.dice.GIF");
diceImageArray[0] = Image.FromFile(imagePath);

Я распределяю код по нескольким строкам, чтобы вам было легче видеть каждый шаг.Вы можете, конечно, объединить некоторые из них.Код был только «скомпилирован» в SO, поэтому я оставлю любые ошибки для вас, чтобы исправить.: -)

Исключением из приведенного выше кода является то, что ваш код копируется в тени.Затем вам нужен доступ к исходному местоположению, из которого оно получено, а не к текущему местоположению.Если это так, то требуется немного больше кода, и я не хотел бы чрезмерно усложнять пример.

Если сборка, которая загружает изображения, всегда находит их относительно себя, тогда ваши тесты должныработать, пока вы убедитесь, что изображения существуют в этом месте.

...