无法使用 SpecFlow 解析 Bodi 接口

Bodi Interface Cannot be resolved using SpecFlow

我到处搜索并找到了多篇关于 Bodi 异常的帖子参考 SpecFlow 但其中 none 与 TestStack.White 和 none 的响应在我的工作情况。

我正在使用以下内容:

我正在尝试使用现有界面将自动化元素转换为 TestStack.White UItem

    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;
    }

当我 运行 测试时,我得到以下错误

Message: Test method SmokeTests.SmokeTestSpec.SmokeTestsFeature.EditsAreSaved threw exception: BoDi.ObjectContainerException: Interface cannot be resolved: 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 已经很长时间了,但我总是被这个容器注入的东西困住。我已阅读文档并搜索了各个站点,但我无法正常工作。

欢迎提出任何建议。我完全被难住了。

BoDi 与所有其他 DI 容器一样,只有在注册后才能解析接口。

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

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

万一有人在这里解决 TestStack.White 将自动化元素转换为 UIItem 的问题,我的问题就太复杂了。

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

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

您可以有一个无效的动作侦听器,只需创建传入 AutomationElement 的新 UItem。这将隐式调用 UIItemFactory.Create 方法,无需为显式调用注册接口。