使用SpecFlow测试WPF应用程序

时间:2014-05-23 11:56:23

标签: c# wpf specflow

为了将SpecFlow测试添加到一系列WPF应用程序中,我目前正在尝试将SpecFlow与VS.NET 2012中非常简单的WPF测试应用程序结合使用。

我正在关注steps outlined in SpecFlow's getting-started,区别在于我有一个包含两个项目的解决方案(WPF一个与SpecFlow一个)。

我的步骤有一个方案和步骤定义。 不幸的是,测试资源管理器中没有列出任何测试,并且选择“运行SpecFlow场景”(根据getting started中的步骤6)没有任何反应。在VS.NET 2012上发现NUnit测试后适配器是必需的我可以让测试运行。不幸的是,我现在难以打开测试中的窗口:

namespace SpecOverflow
{
    [Binding]
    public class StepDefinitions
    {
        static private BackgroundWorker _bw = new BackgroundWorker();
        private MainWindow win;

        [BeforeScenario]
        public void CreateWindow()
        {
            // Need to run this in a separate thread because we get "The calling thread must be STA, because many UI components require this." errors otherwise
            _bw.DoWork += (_,__) => { win = new MainWindow(); };
            _bw.RunWorkerAsync();
            while (_bw.IsBusy)
                ;
        }

        ...
    }
}

然而,这似乎没有创建窗口(我在使用它的第一个构建步骤中得到NullReferenceException。)

我应该补充一点,我已经拥有超过0的VS.NET经验,但只是勉强(可能 两年不到100小时,我所拥有的大部分C#经验都是Mono)。我正在尝试做这个项目,因为我现在有时间和一位同事问我。

1 个答案:

答案 0 :(得分:0)

显然在一个自己的线程中用一个所谓的" STA"创建窗口。 "的ApartmentState"做到了:

var winThread = new Thread(() =>
{
    win = new MainWindow();
    win.Closed += (sender, e) => win.Dispatcher.InvokeShutdown();

    System.Windows.Threading.Dispatcher.Run();
});

winThread.SetApartmentState(ApartmentState.STA);
winThread.Start();