如何在Moq中访问另一个模拟对象中的模拟对象

时间:2010-07-15 15:09:11

标签: c# mocking moq

假设我的接口具有属性另一个接口。类似的东西:

interface IOne  
{  
    ITwo Two { get; set;}   
}  

我为ITwo创建了一个模拟,然后使用IOneMock<ITwo>.Object创建模拟。如果我只引用ITwoIOne,如何在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());

2 个答案:

答案 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>