假设我的接口具有属性另一个接口。类似的东西:
interface IOne
{
ITwo Two { get; set;}
}
我为ITwo
创建了一个模拟,然后使用IOne
为Mock<ITwo>.Object
创建模拟。如果我只引用ITwo
或IOne
,如何在Mock<IOne>
上举办活动?我需要Mock<ITwo>
的参考,但我如何从ITwo
投射到Mock<ITwo>
?我希望很清楚:)
谢谢。
编辑:
我希望这个示例更清晰:
interface IHuman
{
void Sneeze();
INose Nose { get; set;}
}
interface INose
{
event EventHandler Irritated;
}
class ToBeTested
{
private IHuman _human;
public ToBeTested(IHuman human)
{
_human = human;
_human.Nose.Irritated += NoseIrritated;
}
void NoseIrritated(object sender, EventArgs e)
{
_human.Sneeze();
}
}
我希望能够从Mock访问Mock。所以我可以做一些像:
noseMock.Raise(nose => nose.Irritated += null);
humanMock.Verify(human => human.Sneeze());
答案 0 :(得分:2)
我仍然不是完全确定你要求的是什么,但看起来你正试图弄清楚如何从一个模拟对象到Mock<T>
包装器那产生了吗? (“我如何从ITwo
投射到Mock<ITwo>
?”
这很简单:有一个Mock.Get
方法可以找到T的Mock<T>
(只要该对象来自Moq)。
Mock<ITwo> mockTwo = Mock.Get(two);
详细信息可在Moq入门指南中找到:
http://code.google.com/p/moq/wiki/QuickStart#Advanced_Features
答案 1 :(得分:0)
从接口本身你不能引发事件,因为接口不能包含代码,只能包含契约。如果要在实现IOne和ITwo的对象之间进行通信,最好的方法是添加事件接收器并从任一实现注册到该事件。
但是:你不能仅通过接口自动完成这项工作。
您同时编辑了您的问题。什么是Mock<T>
给你?您无法从ITwo
投射到Mock<T>
。如果Mock<T>
继承自ITwo
,则可能出现相反的情况。
注意:也许使用One和Two之外的单词的示例可能有助于我们理解您真正追求的内容?
回答“当我只提到IOne或Mock时,我怎样才能在ITwo上举办活动”,希望我能理解你的想法:
interface IOne
{
void RaiseEventITwo();
ITwo Two { get; set;}
}
// note: left out some details
class One : IOne
{
public One() { this.Two = new Two(); } // Two implements ITwo
public void RaiseEventITwo()
{
this.Two.OnLoadPage(); // i.e.: some event of ITwo is OnLoadPage
}
}
// somewhere where you actually have the reference you speak off
IOne one = new One(); // class One implements IOne
one.RaiseEventITwo();
// using the Mock<T> class:
Mock<IOne> mockOne = new Mock<IOne>();
mockOne.GetIOne().RaiseEventITwo(); // GetIOne needs to be implemented in
// Mock<T> or as extension for Mock<T>