因为我正在阅读一些解决方案,所以他们都试图实现一个新的视图及其视图模型......等等。但我不太清楚这个实用程序。
如何对打开消息框的方法进行单元测试?
如果规范发生变化并且您需要使用不同的(自定义)消息框,或者甚至只记录错误(稍后显示在摘要报告中)怎么办?然后,您需要查找并替换每个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;
}
}
}