【发布时间】:2018-02-13 18:18:51
【问题描述】:
有人可以帮我解决这个错误信息吗?我不明白为什么演员表不起作用:
消息: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();
}
【问题讨论】:
-
这演示了当您违反显式依赖原则时会发生什么。仅要求接口将其转换回实现问题是糟糕的设计。
-
构造函数因此对类真正依赖的内容撒谎。
-
那么你是不是建议我应该将具体类型 ActiveStateElements 传递给构造函数?
-
不,类应该依赖于抽象而不是具体化和实现问题。创建一个接口,提供必要的功能并让派生类封装所需的功能。
-
你为什么要投给
ActiveStateElements。
标签: c# unit-testing mocking moq