使用Moq,System.InvalidCastException:无法将类型为“Castle.Proxies.ObjectProxy”的对象强制转换为类型

时间:2018-02-13 18:18:51

标签: c# unit-testing mocking moq

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

  

消息: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();
}

1 个答案:

答案 0 :(得分:6)

您的模拟是IActiveState,而不是ActiveStateElements

当您致电new Mock<IActiveState>()时,它会动态创建一些实现接口IActiveState的新类型。 这种新类型不能转换为ActiveStateElements,这意味着转换将在构造函数中失败。

你可以创建像var moqElement = new Mock<ActiveStateElements>()这样的模拟,但我想这不会起作用。 ActiveStateElements上的方法可能不是virtual,因此您无法设置任何方法。

真正的问题是ActiveStateElementBehavior对消费者说'我需要实现IActiveState&#34;的东西。然后在内部它需要一个ActiveStateElements的实例。

您应该在IActiveState上定义所需的其他方法,而ActiveStateElementBehavior不应对ActiveStateElements进行任何演员或引用。它应该只知道接口IActiveState