Можно ли виртуализировать доступ к диску консольного приложения, когда оно выделено из приложения C # - PullRequest
0 голосов
/ 22 сентября 2010

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

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

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

Это требует исправления функции Win32 CreateFile API. Что просто технически возможно с Detours от Microsoft Research. Что требует неуправляемого C или C ++.

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

0 голосов
/ 23 сентября 2010

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

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 голосов
/ 22 сентября 2010

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

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

...