繁体   English   中英

C#WPF UnitTesting视图模型

[英]C# wpf UnitTesting viewmodels

我试图在WPF应用程序中对我的ViewModel进行单元测试。 我的视图模型中有一个命令,该命令执行包含确认对话框的方法。 我需要运行所有单元测试,以便每次打开这些对话框时都需要手动确认。

我有一个问题,我可以通过任何方式以编程方式知道哪种方法具有确认对话框,然后以编程方式单击“确定”或“取消”?

最好的解决方案可能不是尝试以编程方式单击“确定”或“取消”,而是防止在运行单元测试时创建对话框。

为此,您需要一个抽象以获取用户确认,如下所示:

public interface IUserConfirmation
{
    bool Confirm(string title, string message);
}

在命令的执行方法中,仅使用此抽象,而不实际显示对话框:

public class ViewModel 
{
    private void MyCommandExecuted(object parameter)
    {
        if (this.confirmation.Confirm("Please confirm", "Are you sure you want to ...?")
        {
            ...
        }
    }

现在,您将创建此接口的两种实现:一种实际向用户显示对话框,另一种仅返回预先配置的值。 在主应用程序中,使用“真实”对话框实现,而在单元测试中,则使用“伪”实现。

为此,您需要能够“注入” ViewModel中的不同实现,例如通过构造函数:

public ViewModel(IUserConfirmation confirmation)
{
    if (confirmation == null)
        throw new ArgumentNullException("confirmation");

    this.confirmation = confirmation;
}

private readonly IUserConfirmation confirmation;

这实际上是一个众所周知的模式,称为“依赖注入”。 有可用的框架可以帮助您创建对象,但是对于像这样的简单情况,则没有必要。

这是两个实现的样子:

public class MessageBoxUserConfirmation : IUserConfirmation
{
    public bool Confirm(string title, string message)
    {
        return MessageBox.Show(title, message) == true;
    }
}

public class TestUserConfirmation: IUserConfirmation
{
    public bool Result { get; set; }

    public bool Confirm(string title, string message)
    {
        return this.Result;
    }
}

在单元测试中,您可以这样使用它:

var confirmation = new TestConfirmation();
var viewModel = new ViewModel(confirmation);

// simulate a user clicking "Cancel"
confirmation.Result = false;

viewModel.MyCommand.Execute(...);

// verify that nothing happened

还有一些框架可以创建这些伪造的实现,而不必一直编写自己的类,但是同样,对于像这样的简单情况,您可能不需要它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM