Как создать тест Spec-Flow для приложения Prism 7? - PullRequest
0 голосов
/ 26 сентября 2019

Я нахожусь в процессе создания нового настольного приложения Windows с Prism 7, и я начал с нового базового класса PrismApplication, который заменил загрузчик.Все было хорошо, пока я не создал (specflow-) тесты.

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

internal partial class App
{
    protected override IContainerExtension CreateContainerExtension()
    {
        var containerExtension = new Prism.Unity.Ioc.UnityContainerExtension();
        containerExtension.Instance.AddExtension( new LogExtension() );
        return containerExtension;
    }

    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes( IContainerRegistry containerRegistry )
    {
        containerRegistry.Register<IConfiguration, AppSettingsConfiguration>();
        containerRegistry.Register<IWindowsInterface, WindowsInterface>();
        // ... a lot of registrations removed here ...
    }
}

И производное тестовое приложение, которое делает все, кроме создания оболочки:

private class MyApp : App
{
    protected override Window CreateShell()
    {
        return null;
    }
}

Завернуто вBeforeScenario хук для инициализации тестового приложения:

[BeforeScenario]
public void InitializeApp()
{
    var app = new MyApp();
    app.Initialize();
    var containerRegistry = (IContainerRegistry)app.Container;

    containerRegistry.RegisterSingleton<TestWindowsInterface>();
    containerRegistry.Register<IWindowsInterface,TestWindowsInterface>();
    // ... some registration overrides removed here ...

    _objectContainer.RegisterInstanceAs<App>( app );
}

И шаг для создания главного окна (CreateShell замена):

[When( @"I start the software" )]
public void WhenIStartTheSoftware()
{
    _container.RegisterInstanceAs( _container.Resolve<App>().Container.Resolve<MainWindowViewModel>() );
}

Пока все хорошо, это работает.Но только до тех пор, пока у вас есть только один сценарий.Как только начинается второй сценарий, мы получаем исключение:

Cannot create more than one System.Windows.Application instance in the same AppDomain.

В старые времена это не было проблемой, потому что Bootstrapper был просто обычным классом, в отличие от PrismApplication, который принудительно должен быть одноэлементным в фреймворке.

Конечно, я могу переместить весь материал регистрации в обычный класс и использовать его для инициализации тестового приложения, но это по сути означает создание моегособственная версия загрузчика поверх из PrismApplication.Использование классического Bootstrapper имеет больше смысла для меня, но оно будет удалено в будущем выпуске (так как сегодня он помечен как устаревший).

1 Ответ

0 голосов
/ 27 сентября 2019

Вы сможете создать несколько экземпляров класса Application, используя класс, производный от MarshalByRefObject:

public class AppDomainWrapper : MarshalByRefObject
{
    public void DoSomething()
    {
        var app = new MyApp();
        app.Initialize();
        ...
        app.Shutdown();
    }
}

Пример использования:

AppDomain appDomain = AppDomain.CreateDomain("AppDomain");
AppDomainWrapper app = appDomain.CreateInstanceAndUnwrap(typeof(AppDomainWrapper).Assembly.FullName, typeof(AppDomainWrapper).FullName) as AppDomainWrapper;
app.DoSomething();
AppDomain.Unload(appDomain);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...