Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何聆听模拟对象';什么事?_C#_Unit Testing_Rhino Mocks - Fatal编程技术网

C# 我如何聆听模拟对象';什么事?

C# 我如何聆听模拟对象';什么事?,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我正在为一个控制器做一些单元测试,并模拟业务组件。BC有一个公共事件,我让控制器在构造控制器时监听该事件 我遇到的问题是,我不断收到一个期望错误,说明: “IBC.add_MessageRaised(MessageEventHandler)预期为#:1实际为#:0” 然而,在我的测试中,我没有任何期望。我想知道这是否与将控制器设置为侦听模拟对象(本例中为BC)上的事件有关。有没有其他方法可以让控制器监听来自模拟的事件 我也在想办法让mock引发MessageRaised事件,但这可能是另一个问题

我正在为一个控制器做一些单元测试,并模拟业务组件。BC有一个公共事件,我让控制器在构造控制器时监听该事件

我遇到的问题是,我不断收到一个期望错误,说明: “IBC.add_MessageRaised(MessageEventHandler)预期为#:1实际为#:0”

然而,在我的测试中,我没有任何期望。我想知道这是否与将控制器设置为侦听模拟对象(本例中为BC)上的事件有关。有没有其他方法可以让控制器监听来自模拟的事件

我也在想办法让mock引发MessageRaised事件,但这可能是另一个问题

代码如下:

业务组件接口

public interface IBC
{
    event MessageEventHandler MessageRaised;
    XmlDocument GetContentXml(string path);
}
控制器

private readonly IBC _bc;

public Controller(IBC bc)
{
    _bc = bc;
    _bc.MessageRaised += MessageWatch;
}
private void MessageWatch(object sender, MessageEventArgs e)
{
    if (MessageRaised != null)
        MessageRaised(sender, e);
}
单元测试

MockRepository Mockery = new MockRepository();
TFactory _tFac;
IView _view;
Presenter _presenter = new Presenter();
IBC _bc = Mockery.DynamicMock<IBC>();
Controller _controller = new Controller(_bc);
_tFac = new TFactory(Mockery);
_tFac.Create(ref _view, ref _presenter, ref _controller);

[Test]
public void View_OnGetContentXmlButtonClick_Should_SetXmlInView()
{
    //SETUP
    XmlDocument xmlDocument = new XmlDocument();
    using ( Mockery.Record() )
    {
        SetupResult.For(_view.FilePath).Return("C:\Test.txt");
        Expect.Call(_bc.GetContentXml("C:\Test.txt")).Return(xmlDocument);
        _view.Xml = xmlDocument.InnerXml;
    }

    //EXECUTE
    using ( Mockery.Playback() )
    {
        _presenter.View_OnGetContentXmlButtonClick();
    }
}
MockRepository mockry=newmockrepository();
tFac工厂;
IView_视图;
演示者_Presenter=新演示者();
IBC_bc=mockry.DynamicMock();
控制器_Controller=新控制器(_bc);
_tFac=新的TF工厂(模拟);
_创建(参考视图、参考演示者、参考控制器);
[测试]
public void View_ongetcontentxmlbutonclick_Should_SetXmlInView()
{
//设置
XmlDocument XmlDocument=新的XmlDocument();
使用(mockry.Record())
{
SetupResult.For(_view.FilePath)。返回(“C:\Test.txt”);
Expect.Call(_bc.GetContentXml(“C:\Test.txt”)).Return(xmlDocument);
_view.Xml=xmlDocument.InnerXml;
}
//执行
使用(mockry.Playback())
{
_presenter.View_OnGetContentXmlButtonClick();
}
}

下面的代码似乎使用了模拟对象,并通过使用它记录了期望值:

Controller _controller = new Controller(_bc);
您使用的模拟对象如下所示:

_bc.MessageRaised += MessageWatch;
因此,您设置了一个期望,即将事件处理程序添加到_bc.MessageRaised。这不会在播放块中发生,因此会引发错误


另请参见关于对象何时进入记录状态。老实说,我也不明白,如果对象以隐式方式进入记录状态,为什么会有显式的记录语法。

我通过结合一些东西来实现它(不完全确定它是如何工作的,但它确实):


希望其他人觉得这有用

下面是我如何处理从模拟对象引发事件的方法:

        port.DataPacketReceived += null;
        packetReceivedRaiser =
            LastCall.IgnoreArguments().Repeat.Any().GetEventRaiser();
在本例中,端口是一个模拟对象,带有一个名为DataPacketReceived的事件


理想情况下,在将模拟对象传递给测试系统之前,我总是尝试将其置于播放模式。这避免了任何“意外的期望”。

谢谢!另一个问题帮助了一些人,因为我不知道BackToRecord()方法。
[Test]
public void View_OnGetContentXmlButtonClick_When_FileDoesNotExist_Should_RelayMessage()
{
    //SETUP
    XmlDocument xmlDocument = new XmlDocument();
    using (Mockery.Record())
    {
        SetupResult.For(_view.FilePath).Return("C:\Test.txt");
        Expect.Call(_bc.GetContentXml("C:\Test.txt")).Return(null);
        _view.Xml = xmlDocument.InnerXml;
        _view.Message = MESSAGE_FILE_NOT_EXIST;
    }

    //EXECUTE
    using (Mockery.Playback())
    {
        _presenter.View_OnGetContentXmlButtonClick();
        _raiser.Raise(_bc, new MessageEventArgs(MESSAGE_FILE_NOT_EXIST));
    }
}
        port.DataPacketReceived += null;
        packetReceivedRaiser =
            LastCall.IgnoreArguments().Repeat.Any().GetEventRaiser();