gpt4 book ai didi

c# - 我如何收听模拟对象的事件?

转载 作者:行者123 更新时间:2023-11-30 22:49:22 24 4
gpt4 key购买 nike

我正在为 Controller 做一些单元测试,并且正在模拟业务组件。 BC 有一个公共(public)事件,我让 Controller 在构建 Controller 时收听该事件。

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

但是,我在测试中并没有这样的期望。我想知道它是否与设置 Controller 以监听模拟对象(在本例中为 BC)上的事件有关。还有另一种方法可以让 Controller 监听来自模拟的事件吗?

我也在想办法让模拟引发 MessageRaised 事件,但这可能完全是另一个问题。

代码如下:

业务组件接口(interface)

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

Controller

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

最佳答案

似乎以下代码使用了模拟对象,并通过使用它导致记录期望:

Controller _controller = new Controller(_bc);

您正在像这样使用模拟对象:

_bc.MessageRaised += MessageWatch;

因此,您已经设置了将事件处理程序添加到 _bc.MessageRaised 的预期。这不会发生在播放 block 中,因此会引发错误。

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

关于c# - 我如何收听模拟对象的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1190487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com