Работа над проектом в ASP.NET Web API 2, в котором в качестве контейнера IoC используется Autofac. Этот проект размещен на IIS, и в моем модуле Autofac я использую следующий метод для сканирования сборок:
var asm = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
Почему?
https://docs.autofac.org/en/latest/register/scanning.html#iis-hosted-web-applications
Но сейчас мы проводим модульные тесты, используя NUnit, во время моей настройки я регистрирую свой модуль, который использует этот метод. Теперь я получаю следующее исключение при выполнении моих тестов:
System.InvalidOperationException: 'This method cannot be called during the application's pre-start initialization phase.'
Я понимаю, почему у меня есть это исключение, но я не знаю, как заставить мой код работать в тестах и для сред развертывания.
Способ установки NUnit:
[TestFixture]
public abstract class ApplicationTestBase
{
[SetUp]
public override void Init()
{
var builder = new ContainerBuilder();
// If the class requires auto mapper mapping, initialize them
// We do this in order not to init them for every test => optimalisation!
if (GetType().GetCustomAttributes<RequiresAutoMapperMappingsAttribute>(false) != null)
{
builder.RegisterModule<AutoMapperModule>();
}
this.Container = builder.Build();
}
}
Нужно ли создавать новый модуль специально для моих юнит-тестов или есть другой способ для этого?
AutoMapperTest
[RequiresAutoMapperMappings]
[TestFixture]
public class AutoMapperTests : ApplicationTestBase
{
[Test]
public void Assert_Valid_Mappings()
{
Mapper.AssertConfigurationIsValid();
}
}
UPDATE
Как говорил Кирилл: зачем вам Ioc в ваших юнит-тестах? Я отправился на поиски, и вам действительно не нужно использовать Ioc в своих тестах. Итак, я отказался от Ioc и инициализировал конфигурацию маппера, выполнив:
Mapper.Initialize(configuration =>
{
var asm = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.StartsWith("ProjectWebService."));
configuration.AddProfiles(asm);
});