C#Nunit错误-MVP体系结构

C#Nunit错误-MVP体系结构,c#,unit-testing,mocking,tdd,nunit,C#,Unit Testing,Mocking,Tdd,Nunit,我正在尝试为一个使用MVP架构的示例项目编写一个单元测试。 运行测试时,出现以下错误消息: UnitTests.Tests.testCopy: 预期:“测试…” 但是是:空 我在下面发布了我所做的片段: namespace Copy { public interface IView { string Copy { get; set; } string Original { get; } event EventHandler Chan

我正在尝试为一个使用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);
        }
    }
}

感谢您的帮助。

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

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

  • 告诉view mock引发
    已更改的
    事件
  • 调用
    get_Original
    property getter时,告诉view mock返回
    “Testing…”
  • 告诉view mock您希望调用
    Copy
    setter并使用
    “Testing…”
  • 验证模拟期望
  • 我不确定NUnit.Mocks是否可以举办活动。从相当小的API判断,我认为不是。但是您可以通过直接调用事件处理程序来解决这个问题(因为它是公共的):

    您可以看到,只需将
    set\u Copy
    预期值更改为
    “Testing…”以外的值,此测试就可以正常工作。
    -它将失败并显示相应的消息

    模拟框架旁注 你使用NUnit.mock而不是更严肃的mock框架的原因是什么?给,或者看一眼

    如果您使用Fakeetisy,您的测试可能会是这样的:

    [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 ...");
    }
    
    [测试]
    查看更改时的公共无效已被取消\u PresenterstCopyProperty()
    {
    var viewMock=A.Fake();
    var presenter=新的presenter(viewMock);
    A.CallTo(()=>viewMock.Original).返回(“测试…”);
    viewMock.Changed+=Raise.With(EventArgs.Empty).Now;
    AreEqual(viewMock.Copy,“测试…”);
    }
    

    请注意,键入
    Cpoy
    而不是
    Copy
    之类的问题会立即消失。更不用说,您不必在公共API中公开事件处理程序。

    我试图测试原始文本框中的更改是否会导致复制文本框中的更改。如果我尝试以下方法:[Test]public void testCopy(){viewMock.ExpectAndReturn(“get_Original”,“Testing…”);viewMock.ExpectAndReturn(“get_Copy”,“Error…”);}测试不会失败。@davidhale:是的,我知道你现在想做什么了。看我的编辑2。就这样。谢谢你的帮助。我还要看一看假货和犀牛肉。@davidhale:不客气。我已经更新了Fakeitesy测试示例-您可以检查它“听起来”比Nunitmock更自然。更不用说,您可以将Presenter事件处理程序保持为私有。祝你好运
    [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 ...");
    }