Bodi接口无法使用SpecFlow解析

时间:2018-12-17 16:57:52

标签: visual-studio specflow teststack

我搜索了所有内容,发现有多篇关于SpecFlow的关于Bodi异常的文章,但它们都与TestStack无关,怀特也没有,并且在我的情况下都没有响应。

我正在使用以下内容:

  • SpecFlow 2.4.0
  • TestStack.White(0.13.3)
  • MsTest(1.4.0)
  • Visual Studio 2017(15.9.4)

我正在尝试使用现有接口将自动化元素转换为TestStack.White UIItem

    UIItemFactory itemFactory { get; set; }
    ActionListener actionListener { get; set; }
    public UIItemFactoryHelper(UIItemFactory itemFactory, ActionListener actionListener)
    {
        this.itemFactory = itemFactory;
        this.actionListener = actionListener;
    }

    public virtual IUIItem CreateIUIItemFromAutoElement(AutomationElement automationElement)
    {
        var item = itemFactory.Create(automationElement, actionListener);

        return item;
    }

然后我像这样使用它

    private DataGrid GetGrid(ParameterizedString Id, Window window = null)
    {
        var form = ScenarioContext.Current["activeForm"];
        var tab = ScenarioContext.Current["activeTab"];
        var parent = GetElementParent(form.ToString(), Id.parentLevel, tab.ToString());

        if (window == null)
        {
            window = WindowHelper.GetWindow();
        }
        var parentUIItem = uiItemFactoryHelper.CreateIUIItemFromAutoElement(parent);
        var element = parentUIItem.Get<DataGrid>(SearchCriteria.ByText("DataGrid"));
        return element;
    }

运行测试时,出现以下错误

  

消息:测试方法SmokeTests.SmokeTestSpec.SmokeTestsFeature.EditsAreSaved   抛出异常:       BoDi.ObjectContainerException:无法解析接口:TestStack.White.Factory.UIItemFactory

我尝试将容器注册到ScenarioHooks中,并将接口注册到Before Scenario钩子中。当我这样做时,我会得到完全一样的东西。

class ScenarioHooks
{
    IObjectContainer objectContainer;
    public XmlHelper xmlHelper { get; set; }
    public ScenarioHooks(XmlHelper xmlHelper, IObjectContainer objectContainer)
    {
        this.xmlHelper = xmlHelper;
        this.objectContainer = objectContainer;
    }
    [BeforeScenario]
    protected void RegisterInterfaces()
    {
        objectContainer.ResolveAll<UIItemFactory>();
    }
}

我已经使用SpecFlow很长时间了,但是我总是被这种容器注入的东西卡住了。我已经阅读了文档并搜索了各个站点,但是无法正常工作。

欢迎提出任何建议。我完全被困在这里。

2 个答案:

答案 0 :(得分:1)

与其他所有DI容器一样,

BoDi只能在有接口注册后才能解析该接口。

要获取UIItemFactory接口的实例,您必须注册一个实现。

在您的RegisterInterfaces方法中,您没有注册接口,而是在解决接口。您必须将行objectContainer.ResolveAll<UIItemFactory>()更改为objectContainer.RegisterTypeAs<THE_IMPLEMENTATION, UIItemFactory>()

答案 1 :(得分:0)

如果有人在这里使用TestStack.White将自动化元素转换为UIItem的问题,上面的问题就太复杂了。

事实证明,您可以通过执行以下操作来隐式执行此操作。

    public virtual IUIItem CreateIUIItemFromAutoElement(AutomationElement automationElement)
    {
        var element = new UIItem(automationElement, new NullActionListener());
        return element;
    }

您可以具有一个空的动作侦听器,只需创建在AutomationElement中传递的新UIItem。这将隐式调用UIItemFactory.Create方法,从而无需为显式调用注册接口。