2

我正在使用该模式开发一个WPF应用程序。MVVM

我知道该MVVM模式很好地分离GUI了应用程序的逻辑,所以我可以GUI独立地测试逻辑。

但是,如果我需要向用户发送一些消息,使用 messageBox 是否是个好主意?因为我正在阅读一些解决方案,所以他们都试图实现一个新的视图及其视图模型......等等。但我不太清楚这个实用程序。

我的意思是,如果我想向用户通知一些东西,我的结果取决于用户的决定,我该如何分离我的测试(GUI 和逻辑)?不直接使用 messageBox 而是使用带有视图模型的新视图以及这需要的所有额外工作有什么好处?因为在这两种情况下,我的结果都取决于用户的决定。在这种情况下如何测试我的应用程序?

4

2 回答 2

5

因为我正在阅读一些解决方案,所以他们都试图实现一个新的视图及其视图模型......等等。但我不太清楚这个实用程序。

如何对打开消息框的方法进行单元测试?

如果规范发生变化并且您需要使用不同的(自定义)消息框,或者甚至只记录错误(稍后显示在摘要报告中)怎么办?然后,您需要查找并替换每个msgBox.Show呼叫。

我的意思是,如果我想向用户通知一些东西,我的结果取决于用户的决定,我该如何分离我的测试(GUI 和逻辑)?

通过创建一个事件,当您需要做出决定时触发该事件。然后你会收回决定。你不在乎它是从哪里来的。

因为在这两种情况下,我的结果都取决于用户的决定。在这种情况下如何测试我的应用程序?

很简单。你只是嘲笑你的用户回复。您可以(并且可能应该)测试两种可能的情况,因此只需附加两个“假”事件处理程序:一个返回肯定决定,一个返回否定决定,就好像您的用户实际上在某个消息框中单击了“是”或“否”。

例如,参见http://joyfulwpf.blogspot.com/2009/05/mvvm-communication-among-viewmodels.html 。

ASpirin提出的注入通知器的建议也是一个不错的设计选择。

一些粗略的、过于简单的实现:

using System;
using System.Windows.Forms;

namespace Demo
{
    public delegate bool DecisionHandler(string question);
    /// <remarks>
    /// Doesn't know a thing about message boxes
    /// </remarks>    
    public class MyViewModel
    {
        public event DecisionHandler OnDecision;

        private void SomeMethod()
        {
            // something...

            // I don't know who or what replies! I don't care, as long as I'm getting the decision!
            // Have you made your decision for Christ?!! And action. ;)
            var decision = OnDecision("Do you really want to?"); 

            if (decision)
            {
                // action
            }
            else
            {
                // another action
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // this ViewModel will be getting user decision from an actual message box
            var vm = new MyViewModel();
            vm.OnDecision += DecideByMessageBox;

            // unlike that one, which we can easily use for testing purposes
            var vmForTest = new MyViewModel();
            vmForTest.OnDecision += SayYes;    
        }        

        /// <summary>
        /// This event handler shows a message box
        /// </summary>        
        static bool DecideByMessageBox(string question)
        {
            return MessageBox.Show(question, String.Empty, MessageBoxButtons.YesNo) == DialogResult.Yes;
        }
        /// <summary>
        /// Simulated positive reply
        /// </summary>        
        static bool SayYes(string question)
        {
            return true;
        }
    }
}
于 2012-08-10T11:54:42.057 回答
3

在任何使用情况下,您都可以创建 Notifier 类(实现您的接口(例如IUserNotifier{ void ShowMessage(string message);}或更复杂)),它将显示消息框。并使用其他实现进行测试,它什么都不显示,只返回结果。当您创建特定样式的视图时,另一个实现将显示它

于 2012-08-10T11:59:01.193 回答