【问题标题】:C# Nunit error - MVP architectureC# Nunit 错误 - MVP 架构
【发布时间】:2012-02-11 23:56:59
【问题描述】:

我正在尝试为使用 MVP 架构的示例项目编写单元测试。 当我运行测试时,我收到以下错误消息:

UnitTests.Tests.testCopy:
预期:“测试...”
但是是:null

我在我做的sn-ps下面发帖:

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# unit-testing mocking tdd nunit


    【解决方案1】:

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

    您应该如何设置测试:

    1. 告诉 view mock 引发 Changed 事件
    2. 在调用 get_Original 属性获取器时告诉 view mock 返回 "Testing ..."
    3. 告诉 view 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 而不是更严肃的模拟框架?给FakeItEasyMoqRhinoMocks 看看。

    如果您改用 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 中公开您的事件处理程序。

    【讨论】:

    • 我正在尝试测试原始文本框的更改是否会导致复制文本框的更改。如果我试试这个: [Test] public void testCopy() { viewMock.ExpectAndReturn("get_Original", "Testing ..."); viewMock.ExpectAndReturn("get_Copy", "不正确..."); } 测试没有失败。
    • @davidhale:是的,我知道你现在想要完成什么。请参阅我的编辑 #2。
    • 就是这样。谢谢您的帮助。我还会看看 FakeItEasy 和 RhinoMocks。
    • @davidhale:不客气。我已经更新了 FakeItEasy 测试示例 - 您可以检查它的 “声音” 比 NUnitMocks 更自然。更不用说,您可以将您的 Presenter 事件处理程序保密。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2018-12-23
    相关资源
    最近更新 更多