Как издеваться над AppDomain.CurrentDomain.BaseDirectory Текущий домен.BaseDirectory

#c# #asp.net-mvc #visual-studio #unit-testing #nunit

#c# #asp.net-mvc #visual-studio #модульное тестирование #nunit

Вопрос:

У меня есть модульный тест с классом обслуживания, я хочу издеваться AppDomain.CurrentDomain.BaseDirectory var someCLass = new SomeClass() над этим классом без изменений.

В этом классе он используется в качестве пути для создания новых путей для чтения файлов. Но если тест выполняется, AppDomain.CurrentDomain.BaseDirectory он будет изменен на другой каталог.

Я не хочу использовать изоляцию typemock, но это похоже на возможное исправление, я хочу найти другой способ решить эту проблему, возможно, с Moq помощью.

 public SomeClass
{
 SomeClass()
 {
  //Use something like that
  var path = AppDomain.CurrentDomain.BaseDirectory;
 }
}

//Test Class
[TestFixture]
public class TestClass
{
 private SomeClass someClass;

 [Test]
 public void SomeTest()
 {
  someClass = new SomeClass();
 }
}

//Change AppDomain.CurrentDomain.BaseDirectory for unit test without changing original class.
 

Комментарии:

1. Не абстрагируйтесь от этой статической зависимости

2. Помогает ли это? leotwng.blogspot.com/2010/06 /…

Ответ №1:

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

Существует простое решение, которое не требует большого количества изменений, просто добавьте новый параметр либо в конструктор, либо в метод, который вы действительно хотите протестировать, и передайте фактический путь к нему.

Ваш код может выглядеть следующим образом:

 public SomeClass 
{
   public SomeClass(string baseLocation)
}
 

затем, когда вы создаете его экземпляр, вы можете просто сделать что-то вроде

 var basePath = AppDomain.CurrentDomain.BaseDirectory;

var someClass = new SomeClass(basePath);
 

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

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