MSTest — как инициализировать log4net для проекта UnitTest?

У меня есть проект модульного тестирования Visual Studio для тестирования проекта ASP.NET MVC.

Добавление атрибута log4net.Config.XmlConfigurator уровня сборки в AssemblyInfo.cs не работает, и другие люди в SO обнаружили, что им нужно использовать прямой вызов log4net.Config.XmlConfigurator.Configure();

Вопрос в том, как это можно сделать для модульного теста? Ответ на использование атрибута Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize в методе класса не работает.

Для меня этот код приводит к InvalidOperationException, зарегистрированному в окне вывода, и тестовая сессия взрывается раньше.

[TestClass]
public sealed class Startup
{
    [AssemblyInitialize]
    public void Configure()
    {
        System.Diagnostics.Debug.Write("Microsoft.VisualStudio.TestTools.UnitTesting.AssemblyInitialize");
    }
}

Читая документацию, MSDN говорит, что не следует использовать AssemblyInitialize в тестовых проектах для ASP.NET, поскольку они могут вызываться более одного раза.

Так как же сделать так, чтобы log4net настраивался до запуска каких-либо тестов?


person Luke Puplett    schedule 11.07.2014    source источник
comment
Могу ли я предложить другой подход, используя абстракцию для log4net, что-то вроде ILogger, который определяет отладку, информацию, предупреждение и т. д. Таким образом, вы можете предоставить различные реализации для ILogger, используя log4net для фактического ведения журнала и для использования в вашего фактического приложения, а другой — что-то вроде InMemoryLogger, который может быть очень удобен для использования в UnitTesting. Затем вы можете даже имитировать (используя moq) ILogger, что невозможно при непосредственном использовании log4net.   -  person Ibrahim ben Salah    schedule 31.12.2014
comment
Ваш подход лучше. Хотя я занимаюсь абстрактным логированием, я не делаю DI с логированием, так как мне никогда не нужно было переключать компонент логирования — они все равно настолько настраиваемые — поэтому, если бы настал день, когда log4net должен был уйти, я бы просто перекодировал моя фабрика ILogger. В этом случае я просто хотел увидеть свои операторы регистрации в отладчике.   -  person Luke Puplett    schedule 02.01.2015


Ответы (1)


Ответ заключался в том, что я неправильно использовал AssemblyInitialize.

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

Довольно дерьмовое использование атрибута, если метод должен быть определенным образом, если вы спросите меня. Не очень обнаруживаемый.

Во всяком случае, это работает:

[TestClass]
public static class Startup
{
    [AssemblyInitialize]
    public static void Configure(TestContext tc)
    {
        log4net.Config.XmlConfigurator.Configure();
    }
}

Что касается совета не использовать это для теста ASP.NET, черт с ним. Это может быть запущено более одного раза, но это не имеет значения.

person Luke Puplett    schedule 11.07.2014