无法使用 SpecFlow 解析 Bodi 接口
Bodi Interface Cannot be resolved using SpecFlow
我到处搜索并找到了多篇关于 Bodi 异常的帖子参考 SpecFlow 但其中 none 与 TestStack.White 和 none 的响应在我的工作情况。
我正在使用以下内容:
- SpecFlow 2.4.0
- TestStack.White(0.13.3)
- MsTest(1.4.0)
- Visual Studio 2017(15.9.4)
我正在尝试使用现有界面将自动化元素转换为 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 方法,无需为显式调用注册接口。
我到处搜索并找到了多篇关于 Bodi 异常的帖子参考 SpecFlow 但其中 none 与 TestStack.White 和 none 的响应在我的工作情况。
我正在使用以下内容:
- SpecFlow 2.4.0
- TestStack.White(0.13.3)
- MsTest(1.4.0)
- Visual Studio 2017(15.9.4)
我正在尝试使用现有界面将自动化元素转换为 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 方法,无需为显式调用注册接口。