mvvm一般疑惑和messageBox

时间:2012-08-10 11:48:17

标签: c# mvvm

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

我知道MVVM模式可以分离GUI和应用程序的逻辑,因此我可以独立测试GUI和逻辑。

但是,如果我需要向用户发送一些消息,是否最好使用messageBox?因为我正在阅读一些解决方案,所有人都尝试将新视图实现为视图模型......等等。但我看不到实用程序。

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

2 个答案:

答案 0 :(得分:5)

  

因为我正在阅读一些解决方案,所有人都会尝试   实现一个新的视图,一个它的视图模型......等等,但我没有看到   实用工具。

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

如果规范发生更改并且您需要使用其他(自定义)消息框,甚至只记录错误(稍后将在摘要报告中显示),该怎么办?然后,您需要查找并替换每个msgBox.Show来电。

  

我的意思是,如果我想向用户通知某些内容,我的结果   取决于用户的决定,我如何分开我的测试(GUI   和逻辑)?

创建一个事件,当您需要做出决定时触发该事件。然后你就得到了决定。你不在乎它来自哪里。

  

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

非常简单。你只是模仿你的用户回复。您可以(也可能应该)测试两种可能的场景,因此只需附加两个“假”事件处理程序:一个返回正面决策,一个返回否定决策,就像您的用户在某个消息框中实际单击“是”或“否”一样。 / p>

例如,请参阅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;
        }
    }
}

答案 1 :(得分:3)

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