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

谢谢你的帮助。

C#Nunit错误-MVP架构

"我正在尝试测试原始文本框中的更改是否会导致复制文本框的更改。"

以下是您应该如何设置测试:

  1. 告诉视图mock引发Changed事件
  2. 告诉视图mock在调用get_Original属性getter时返回"Testing ..."
  3. 告诉视图mock您期望调用具有"Testing ..."值的Copy setter
  4. 验证模拟预期

我不确定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中公开您的事件处理程序。