有人可以帮我解决此错误消息吗?我不明白为什么演员不起作用:


  消息: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

07-28 03:50