C#Nunit错误-MVP架构
本文关键字:架构 -MVP 错误 C#Nunit | 更新日期: 2023-09-27 18:24:14
我正试图为一个使用MVP体系结构的示例项目编写一个单元测试。当我运行测试时,我收到以下错误消息:
UnitTests.Tests.testCopy:
应为:"正在测试…"
但是是:空
我在下面发布了我所做的片段:
namespace Copy
{
public interface IView
{
string Copy { get; set; }
string Original { get; }
event EventHandler Changed;
}
public class Presenter
{
private IView view;
public Presenter(IView view)
{
this.view = view;
this.view.Changed += new EventHandler(OnChanged);
}
public void OnChanged(object sender, EventArgs e)
{
view.Copy = view.Original;
}
}
public partial class Form1 : Form, IView
{
private Presenter presenter;
public Form1()
{
InitializeComponent();
presenter = new Presenter(thisIView);
this.t_originalviewMock.TextChanged += OnChanged;
}
public string Original
{
get { return t_originalMockInstance).Text; }
}
public string Copy
{
get { return t_copy.Text; }
set { t_copy.Text = value;}
}
private void OnChanged(object sender, EventArgs e)
{
if (Changed != null)
Changed(sender, e);
}
public event EventHandler Changed;
}
}
单元测试代码:
namespace UnitTests
{
[TestFixture]
public class Tests
{
private DynamicMock viewMock;
private Presenter presenter;
[SetUp]
public void setup()
{
viewMock = new DynamicMock(typeof(IView));
presenter = new Presenter((IView)viewMock.MockInstance);
}
[Test]
public void testCopy()
{
viewMock.ExpectAndReturn("get_Original", "Testing ...");
viewMock.Expect("get_Cpoy");
Assert.AreEqual("Testing ...",
((IView)viewMock.MockInstance).Copy);
}
}
}
谢谢你的帮助。
"我正在尝试测试原始文本框中的更改是否会导致复制文本框的更改。"
以下是您应该如何设置测试:
- 告诉视图mock引发
Changed
事件 - 告诉视图mock在调用
get_Original
属性getter时返回"Testing ..."
- 告诉视图mock您期望调用具有
"Testing ..."
值的Copy
setter - 验证模拟预期
我不确定NUnit.Mocks是否有可能引发事件。根据相当小的API判断,我会说没有。但是你可以通过直接调用事件处理程序来解决这个问题(因为它无论如何都是公共的):
viewMock.ExpectAndReturn("get_Original", "Testing ...");
viewMock.Expect("set_Copy", "Testing ...");
presenter.OnChanged(viewMock, EventArgs.Empty);
// here we verify expectations set on mock object;
// that Copy setter was called with "Testing ..." value
viewMock.Verify();
您可以看到,通过简单地将set_Copy
的期望值更改为"Testing ..."
以外的值,这个测试确实有效——它将失败,并显示相应的消息。
模拟框架旁注
你使用NUnit.Mocks而不是更严肃的mocking框架的原因是什么?看看FakeIseasy、Moq或RhinoMocks。
这就是如果你使用FakeItEasy:,你的测试会是什么样子
[Test]
public void WhenViewChangedEventIsRaised_PresenterSetsCopyProperty()
{
var viewMock = A.Fake<IView>();
var presenter = new Presenter(viewMock);
A.CallTo(() => viewMock.Original).Returns("Testing ...");
viewMock.Changed += Raise.With(EventArgs.Empty).Now;
Assert.AreEqual(viewMock.Copy, "Testing ...");
}
请注意,像键入Cpoy
而不是Copy
这样的问题会立即消失。更不用说,您不必在公共API中公开您的事件处理程序。