Интерфейс Боди не может быть решен с помощью SpecFlow - PullRequest
0 голосов
/ 17 декабря 2018

Я искал повсюду и нашел несколько сообщений об исключениях Боди со ссылкой на 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 ]

0 голосов
/ 18 декабря 2018

В случае, если кто-то здесь для TestStack.White проблема преобразования элемента автоматизации в UIItem является более сложной, чем выше.

Оказывается, вы можете сделать это неявным образом, выполнив следующие действия.

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

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

0 голосов
/ 18 декабря 2018

BoDi, как и любой другой DI-контейнер, может разрешать интерфейс только при наличии регистрации для него.

Чтобы получить экземпляр интерфейса UIItemFactory, необходимо зарегистрировать реализацию.

В вашем RegisterInterfaces методе вы не регистрируете интерфейс, вы его разрешаете.Вы должны изменить строку objectContainer.ResolveAll<UIItemFactory>() на objectContainer.RegisterTypeAs<THE_IMPLEMENTATION, UIItemFactory>()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...