有人可以帮我解决此错误消息吗?我不明白为什么演员阵容不起作用:
消息: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();
}
答案 0 :(得分:6)
您的模拟是IActiveState
,而不是ActiveStateElements
。
当您致电new Mock<IActiveState>()
时,它会动态创建一些实现接口IActiveState
的新类型。
这种新类型不能转换为ActiveStateElements
,这意味着转换将在构造函数中失败。
你可以创建像var moqElement = new Mock<ActiveStateElements>()
这样的模拟,但我想这不会起作用。 ActiveStateElements
上的方法可能不是virtual
,因此您无法设置任何方法。
真正的问题是ActiveStateElementBehavior
对消费者说'我需要实现IActiveState
&#34;的东西。然后在内部它需要一个ActiveStateElements
的实例。
您应该在IActiveState
上定义所需的其他方法,而ActiveStateElementBehavior
不应对ActiveStateElements
进行任何演员或引用。它应该只知道接口IActiveState