【问题标题】:Unit testing DelegateCommand using Rhino Mock使用 Rhino Mock 对 DelegateCommand 进行单元测试
【发布时间】:2021-09-27 23:28:44
【问题描述】:

我正在尝试对显示对话框的命令的命令执行进行单元测试,但是我不断收到 NullReferenceException,我不知道为什么。任何建议将不胜感激。

view sn-p使用的viewmodel:

public class ConvertFileDialogViewModel:IConvertFileDialogViewModel
{
    private string _inputFolderPath;

    public DelegateCommand SelectInputFolderCommand { get;set; }
        
    public ConvertFileDialogViewModel()
    {
        SelectInputFolderCommand = new DelegateCommand(SelectInputFolderDialog);
    }

    public string InputFolderPath
    {
        get => _inputFolderPath;
        set
        {
            _inputFolderPath = value;
            OnPropertyChanged(nameof(InputFolderPath));
        }
    }
        

    public void SelectInputFolderDialog()
    {
        using (var fbd = new FolderBrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
            {
                InputFolderPath = fbd.SelectedPath;
            }
        }
    }
}    

接口sn-p:

public interface IConvertInterviewDialogViewModel
{
    string InputFolderPath { get; set; }
    DelegateCommand SelectInputFolderCommand { get;set; }
    
}

单元测试 sn-p:

[TestMethod]
public void SelectInputFolderCommandTest()
{
    var model = MockRepository.GenerateMock<IConvertFileDialogViewModel>();
    model.SelectInputFolderCommand.Execute();
    model.AssertWasCalled(vm=>vm.SelectInputFolderCommand);
}

错误:

ConvertInterviewDialogViewModelTests.SelectInputFolderCommandTest threw exception: System.NullReferenceException: Object reference not set to an instance of an object.

【问题讨论】:

    标签: c# wpf unit-testing mvvm rhino-mocks


    【解决方案1】:

    我从未使用过 Rhino Mocks,但我可以从中推断出什么

    var model = MockRepository.GenerateMock<IConvertFileDialogViewModel>();
    

    是你创建了一个接口的模拟,它不会调用ConvertFileDialogViewModel的构造函数,因此SelectInputFolderCommand属性将保持null

    编辑
    正如 Nkosi 正确指出的那样,您不能使用 ViewModel 的命令,因为它会调用一个您无法进行单元测试的对话框。
    因此,您需要在创建模拟后初始化SelectInputFolderCommand 属性。

    【讨论】:

    • 您的观察是正确的,但在这种情况下,您关于嘲笑被测对象的建议是错误的。他们的代码与 UI 问题紧密耦合,这使得在不重构紧密耦合的情况下很难对其进行隔离测试。
    • @Nkosi:哦,你是对的,该命令会调用一个对话框,这对于单元测试来说不是很好。
    • 感谢 cmets,我解耦了 UI 组件并测试了返回路径的位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多