代码之家  ›  专栏  ›  技术社区  ›  Mehmet

从windows窗体messagebox获取文本并动态关闭它

  •  1
  • Mehmet  · 技术社区  · 4 年前

    我尝试对windows窗体进行单元测试。有些表单有显示messagebox的代码。我想测试messagebox文本并从单元测试关闭messagebox表单。我怎么做呢?

    public partial class Form1 : Form
    {
        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("Form opened");
        }
    }
    
        [TestMethod]
        public void Form1_Load()
        {
            Form1 form = new Form1();
            //How to find messagebox to test TEXT and close the MESSAGEBOX form?
        }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Harald Coppoolse    4 年前

    我认为您不想测试MessageBox的功能,毕竟这是一种windows方法。你必须相信微软已经测试过这个类。

    您想要测试的是,当表单加载时,它会向操作员显示一些信息。您想隐藏这是使用MessageBox完成的。这样做的好处是,如果希望其他方法向操作员显示某些内容,可以重用此方法。

    换句话说:表单有一个OperatorInfo对象(TODO:发明一个专有名称)。此对象实现一个接口:

    interface IOperatorInformer
    {
        void ShowMessage(string text, ...);
        void ShowWarning(string text, ...);
        void ShowError(string text, ...);
        ...
    }
    

    如果您需要语言意识,考虑创建具有所有警告和错误的枚举。接口将是:

    enum OperatoInformationId {...}
    interface IOperatorInformer
    {
        void InformOperator(OperatorInformationId id, ...);
        ...
    }
    

    class OperatorInformer : IOperatorInformer
    {
        ...
    
        public static IOperatorInformer Default {get;} = new OperatorInformer;
    }
    

    此操作员信息表可以使用 MessageBox.Show 显示所需的文本,包括所需的图标、声音、标题等。

    这不会解决测试MessageBox是否显示的问题,但由于这是一个小类,所以出错的机会很小。如果您真的需要测试操作器,请考虑用接口做同样的操作。 IMessageBox MessageBox System.Windows.Forms.MessageBox 显示消息。

    class Form1 : Form
    {
        // make sure there is always at least the default operator informer:
        public IOperatorInformer OperatorInformer {get; set;} = OperatorInformer.Default();
    
        ...
    }
    

    单元测试方法Form1\u负载

    定义接口IOperatorInformer后,可以更改您的要求:

    要求 :当Form1加载时,方法 IOperatorInformer.ShowMessage 只调用一次,其中包含一个文本“Form Open”,一个图标。。。还有一个标题栏。。。

    这是一种更容易进行单元测试的方法:

    class UnitTestInformer : IOperatorInformer
    {
        public int CallCount {get; private set;} = 0;
        public string Text {get; private set;}
        public MessageBoxIcon Icon {get; private set;} = MessageBoxIcon.None;
        ...
    
        public void ShowMessage(string text, MessageBoxIcon icon, ...)
        {
            ++this.CallCount;
            this.Text = text,
            this.Icon = icon,
            ...
        }
    }
    

    您的单元测试(每个测试只测试需求中的一件事情)

    [TestMethod]
    public void Form1_Load_ShowsOperatorInputExactlyOnce()
    {
        // Create a unitTestInformer and a Form1 that uses this UnitTestInformer
        UnitTestInformer unitTestInfomer = new UnitTestInformer();
        Form1 form = new Form1()
        {
            OperatorInformer = unitTestInformer;
        };
        form.Show();  // this should Load the form
    
        Assert.AreEqual(1, unitTestInformer.CallCount);
    }
    

    [测试方法] public void Form1_Load_OperatorInputText() {

        UnitTestInformer unitTestInfomer = new UnitTestInformer();
        Form1 form = new Form1()
        {
            OperatorInformer = unitTestInformer;
        };
        form.Show();
    
        Assert.AreEqual("Form opened", unitTestInformer.Text);
    }
    

    等等。还有图标和标题栏的单元测试

        2
  •  0
  •   Mehmet    4 年前

    public partial class Form1 : Form
    {
        public Form1(){InitializeComponent();}
        internal bool is_Message_Show = true;
        internal string message_For_Test ;
        internal DialogResult dialogResult_From_Test;
        internal void btnAdd_Click(object sender, EventArgs e)
        {
            DialogResult result = DialogResult.No;
            if (is_Message_Show)
            {
                result = MessageBox.Show("Do you want to add", "WARNING", MessageBoxButtons.YesNo);
            }
            else
            {
                result = dialogResult_From_Test;
            }
            if (result == DialogResult.Yes)
            {
                
            }
        }
    
        internal void btnDelete_Click(object sender, EventArgs e)
        {
            string message = "Deleted";
            if (is_Message_Show)
            {
                MessageBox.Show(message);
            }
            else
            {
                message_For_Test = message;
            }
        }
    }
    
        [TestMethod]
        public void btnAdd_Click_Yes()
        {
            Form1 form = new Form1();
            form.is_Message_Show = false;
            form.dialogResult_From_Test = System.Windows.Forms.DialogResult.Yes;
            form.btnAdd_Click(null, null);
            
        }
        [TestMethod]
        public void btnDelete_Click()
        {
            Form1 form = new Form1();
            form.is_Message_Show = false;
            form.btnDelete_Click(null, null);
            Assert.AreEqual("Deleted", form.message_For_Test);
        }