有人可以帮我解决此错误消息吗?我不明白为什么演员不起作用:
消息:System.InvalidCastException:无法转换类型的对象
键入“ Castle.Proxies.ObjectProxy”
'Automation.Pages.ToolbarElements.ElementsWithActiveState.ActiveStateElements'。
这是我的测试:
[TestFixture]
[Category("unit")]
class ActiveStateElementBehaviorTests
{
[Test]
public void GetCurrentElementState_StateIsActive_ReturnActive()
{
var moqElement = new Mock<IActiveState>();
moqElement.Setup(x => x.IsElementInActiveState()).Returns(() => true);
var behavior = new ActiveStateElementBehavior(moqElement.Object);
behavior.GetCurrentElementState().Should().BeEquivalentTo(ElementState.Active);
}
}
这是我的代码:
public class ActiveStateElementBehavior : IElementStateBehavior
{
public ActiveStateElementBehavior(IActiveState toolbarElement)
{
Element = (ActiveStateElements)toolbarElement;
}
public ENAEPToolbarElement Element { get; }
public ElementState GetCurrentElementState()
{
var element = (ActiveStateElements) Element;
return element.IsElementInActiveState() ? ElementState.Active :
element.IsButtonInEnabledState() ? ElementState.Default :
ElementState.Disabled;
}
}
public interface IActiveState
{
bool IsElementInActiveState();
}
最佳答案
您的模拟是IActiveState
,而不是ActiveStateElements
。
调用new Mock<IActiveState>()
时,它正在动态创建一些实现接口IActiveState
的新类型。
此新类型不能转换为ActiveStateElements
,这意味着强制转换将在构造函数中失败。
您可以像var moqElement = new Mock<ActiveStateElements>()
这样创建模拟,但我想那将行不通。 ActiveStateElements
上的方法可能不是virtual
,因此您将无法设置任何方法。
真正的问题是ActiveStateElementBehavior
对消费者说:“我需要一些实现IActiveState
的东西”。然后在内部需要一个ActiveStateElements
实例。
您应该在IActiveState
上定义所需的其他任何方法,并且ActiveStateElementBehavior
不应具有任何强制类型或对ActiveStateElements
的引用。它应该只知道接口IActiveState