Интерфейс Боди не может быть решен с помощью SpecFlow

Я искал повсюду и нашел несколько сообщений об исключениях Bodi со ссылкой на SpecFlow, но ни один из них не относится к TestStack.White, и ни один из ответов не работает в моей ситуации.

Я использую следующее:

  • 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 ответа

Решение

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

Вы можете иметь обработчик действий с нулевым значением и просто создать новый UIItem, передавая в AutomationElement. Это неявно вызовет метод UIItemFactory.Create, устраняя необходимость регистрировать интерфейс для явного вызова.

Другие вопросы по тегам