Интерфейс Боди не может быть решен с помощью 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, устраняя необходимость регистрировать интерфейс для явного вызова.