我在应用程序中一直使用MVP模式。但是我在测试我的方法时遇到了问题,单击按钮后就会调用它。这是代码:

public interface IControl
    {
        bool Enabled { get; set; }
        string Text { get; set; }
    }

public interface IButton : IControl
    {
        event EventHandler Click;
    }

public class Button : System.Windows.Forms.Button, IButton
    { }

public interface IForm : IControl
    {
        void Show();
        void Close();
    }

public interface IView : IForm
    {
        IButton Button1 { get; }
    }

public partial class View : Form, IView
    {
        public View()
        {
            InitializeComponent();
        }

        #region IView Members

        public IButton Button1
        {
            get { return button1; }
        }

        #endregion
    }

public class Presenter
    {
        IView view;

        public Presenter(IView view)
        {
            this.view = view;
            this.view.Button1.Click += ButtonClick;
            this.view.Show();
        }

        private void ButtonClick(object sender, EventArgs e)
        {
            view.Button1.Text= "some text";
        }
    }


问题是我不知道如何编写测试才能调用ButtonClick方法。我这样尝试过:

var view = new Mock<IView>();
view.Setup(x => x.Button1).Returns(new Mock<IButton>().SetupAllProperties().Object);
Presenter presenter = new Presenter(view.Object);
view.Raise(x => x.Button1.Click+= null, EventArgs.Empty);
Assert.AreEqual("some text", view.Object.Button1.Text);


我认为问题出在这一行:

this.view.Button1.Click += ButtonClick;


似乎Click事件不记得ButtonClick方法。如何使单击存根正常工作。
任何建议都欢迎。
提前致谢。
问候,
金刚

编辑:当我创建SubscribeOnClick(EventHandler click)时,我能够做到; IButton接口中的方法,而不是事件EventHandler Click。我在想起方法的地方做了一些ButtonMock。但是,如果有人知道更好的解决方案,请与我分享。

最佳答案

在这里使用command pattern也许不是一个坏主意。您的IView是非常特定于实现的,因为它具有规定数量的控件,这些控件应具有Click事件(我知道这是一个示例,但仍然...)。

命令模式的简单实现是让IView具有演示者提供的List<Action>,并让视图的特定实现决定如何触发这些动作,例如通过做

this.button1.Click += (sender, e) => this.Actions[0]();


模拟对象不需要具有Click事件(Moq甚至可能不支持该事件)。您可以让它触发其动作之一。

关于c# - 使用Moq测试WinForms MVP和事件机制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7570343/

10-12 00:04
查看更多