MVVMLight RelayCommand.RaiseCanExecuteChanged不会引发CanExecuteChanged事件

问题描述 投票:1回答:1

我正在使用MVVMLight框架在WPF中开发一个应用程序。

我正在尝试进行单元测试(我是新手)。所以我尝试通过在我的命令上订阅CanExecuteChanged事件来模拟我的视图,并验证它是否被正确调用。但是当我这样做时,它永远不会被调用,即使我调用了RaiseCanExecuteChanged方法。

这是一个非常简单的示例:

bool testCanExec = false;
var testCmd = new RelayCommand(
                     execute:    () => { System.Diagnostics.Debug.WriteLine($"Execute call"); },
                     canExecute: () => { System.Diagnostics.Debug.WriteLine($"CanExecute call"); return testCanExec; }
                );
testCmd.CanExecuteChanged += ((sender, args) => { System.Diagnostics.Debug.WriteLine($"CanExecuteChanged call"); });
testCanExec = true;
testCmd.RaiseCanExecuteChanged(); // <= nothing in output
testCmd.Execute(null);            // <= output: "CanExecute call", "Execute call"

我真的无法理解的是它似乎与我的按钮一起工作。我不知道如何正确启用和禁用。

谢谢你的帮助。

c# wpf mvvm-light relaycommand
1个回答
1
投票

RelayCommandRaiseCanExecuteChanged方法简单地称CommandManager.InvalidateRequerySuggested()在单元测试的背景下没有效果:https://github.com/lbugnion/mvvmlight/blob/b23c4d5bf6df654ad885be26ea053fb0efa04973/V3/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommandGeneric.cs

..因为没有控制权已经订阅了CommandManager.RequerySuggested事件。

此外,您通常不应该编写测试第三方框架功能的单元测试。您应该专注于测试自己的自定义功能。

但是如果你想测试CanExecute方法,你应该简单地调用它而不是提高CanExecuteChanged事件:

bool b = testCmd.CanExecute(null);  
© www.soinside.com 2019 - 2024. All rights reserved.