Как издеваться над AppDomain.CurrentDomain.BaseDirectory - PullRequest
0 голосов
/ 18 апреля 2019

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

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

Я не хочу использовать typemock Isolate, но это похоже на возможное исправление, я хочу найти другой способ решить эту проблему, возможно, с помощью 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 Ответ

0 голосов
/ 24 апреля 2019

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

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

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

public SomeClass 
{
   public SomeClass(string baseLocation)
}

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

var basePath = AppDomain.CurrentDomain.BaseDirectory;

var someClass = new SomeClass(basePath);

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

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

...