2010-09-22 4 views
0

У меня есть приложение A, которое запускает приложение B в качестве консольного приложения. Я хотел бы написать модульные тесты как часть приложения A, которые проверяют ввод/вывод из приложения B, но приложение B использует жестко закодированные пути для поиска некоторых своих входов. Я хотел бы иметь возможность запускать приложение, но перехватить вызов для чтения из c: \ wherever \ whatever.txt и предоставить содержимое этого файла.Можно ли виртуализировать доступ к диску на консольном приложении, если он был извлечен из приложения C#

Любые каркасы или куски, которые могут сделать это для меня?

+0

Я полагаю, что есть какая-то причина, почему вы не можете просто написать свои собственные тестовые данные с: \, где \ whatever.txt перед вызовом приложения и возвратом исходного содержимого? – MarcE

+0

Пара уточнения комментариев: 1.) консольное приложение является Java-приложение. Так что это скорее вопрос виртуализации доступа к приложениям приложений, а не приложения CLR. 2.) У меня нет доступа к источнику Java-приложения. 3.) эти пути являются унифицированными. – Hounshell

ответ

1

Это требует исправления функции API WinFormFileFile. Это просто технически возможно с помощью Detours от Microsoft Research. Для чего требуется неуправляемый C или C++.

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

0

Это почти невозможно !! Я говорю почти потому, что можно перехватывать вызовы в CLR, но это черная магия и не рекомендуется, если вы не разработчик CLR - возможно, несколько сотен человек в мире.

Вы можете сделать жестко закодированные пути в качестве параметров командной строки и решить эту проблему таким образом.

0

Вы можете включить приложение B в качестве ссылки в приложение A, а затем использовать Mocking frameworks, чтобы изменить поведение методов или свойств B при прямом вызове его API. Это тот же процесс, который используется для модульных тестов при настройке ожиданий от зависимостей. Существуют ограничения, которые обычно выполняются только в том случае, если рассматриваемый объект является интерфейсом или содержит vi rtual (overridable) методы/свойства. Решение также может зависеть от возможности вливания зависимости в Bs API, что может быть или не быть возможным в зависимости от сценария.

Moq, Rhino Mocks. и TypeMock обеспечивают эту функциональность. Вот краткий пример Moq переопределить поведение метода GetPath с альтернативным значением:

// create a mocked version of a class and setup an expectation 
var appBClassMoq = new Mock<AppBClass>(); 
appBClassMoq.SetUp(o => o.GetPath()).Returns("C:\MyNewPath"); 

// get the mocked instance 
var appBClass = appBClassMoq.Object; 

// run some code, when it hits GetPath() it will return the mock value 
appBClass.SomeMethodThatCallsGetPath(); 
+0

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

Смежные вопросы