我有演示者,视图和模型。 View不知道主持人。 演示者只需通过界面编排所有内容并了解视图:
public interface ISuspiciousListManagementView
{
void ShowMessageBox(MessageBoxButtons messageBoxButtons, string message, string caption, EMessageBoxIcons icon);
void ShowDialog(IWin32Window owner);
object AllTypesDataSource { get; set; }
SuspiciousListType SelectedType { get; set; }
event EventHandler SelectedTypeChanged;
string FilePath { get; set; }
bool ShowOnlyActive { get; set; }
object AllHistoryAvailableTypesDataSource { get; set; }
SuspiciousFilteredListType SelectedHistoryType { get; set; }
event EventHandler SelectedHistoryTypeChanged;
object HistoryDataGridSource { get; set; }
event EventHandler SelectedShowOnlyActiveChanged;
ICommand BrowseFileCommand { get; set; }
ICommand UploadCommand { get; set; }
ICommand RefreshCommand { get; set; }
}
Presenter持有方法Init:
public async Task Init()
{
_view.AllTypesDataSource = Enum.GetValues(typeof(SuspiciousListType));
_view.AllHistoryAvailableTypesDataSource = Enum.GetValues(typeof(SuspiciousFilteredListType));
_view.SelectedTypeChanged += OnSelectedTypeChanged;
_view.SelectedHistoryTypeChanged += OnSelectedHistoryTypeChanged;
_view.SelectedShowOnlyActiveChanged += OnSelectedShowOnlyActiveChanged;
_view.HistoryDataGridSource = await GetFilterHistoryItems();
}
和fileld:
private readonly ISuspiciousListManagementView _view;
这是通过构造函数注入的。
我需要验证这些代码行是否已运行:
_view.SelectedTypeChanged += OnSelectedTypeChanged;
_view.SelectedHistoryTypeChanged += OnSelectedHistoryTypeChanged;
_view.SelectedShowOnlyActiveChanged += OnSelectedShowOnlyActiveChanged;
我想运行类似的东西:
[Test]
public async void Presenter_Verify_HistoryDataGridSource_assigned_Test()
{
await _presenter.Init();
_viewMock.Verify(dp => dp.SelectedHistoryTypeChanged != null);//Compilation error
}
如何测试已添加的事件处理程序? 我的设计出了什么问题?
提前感谢您的帮助。
答案 0 :(得分:1)
如果是“自动”事件,请执行以下操作:
class Test {
public event Action MyEvent;
}
你可以通过反思得到调用列表:
var eventField = test.GetType().GetField(nameof(test.MyEvent), BindingFlags.Instance | BindingFlags.NonPublic);
var eventDelegate = eventField.GetValue(test);
//either get invocation list or just compare eventDelegate with null
var invocationList = eventDelegate != null ? ((Delegate)eventDelegate).GetInvocationList() : new Delegate[0];
bool anySubscribers = invocationList.Length > 0;
这是因为编译器将MyEvent
扩展为(非常粗略地)这个:
class Test {
private Action MyEvent;
public event Action MyEvent
{
add { Delegate.Combine(this.MyEvent, (Delegate) value);}
remove { Delegate.Remove(this.MyEvent, value); }
}
}
我们可以获得私有(编译器生成的)字段的值。
如果事件明确实施:
class Test {
public event Action MyEvent
{
add
{
// do something
}
remove
{
// do something else
}
}
}
你不能这样做,因为甚至可能不是订阅者的概念 - add
和remove
可以执行任意操作。但这很可能不是你的情况。
答案 1 :(得分:1)
您还可以构建带有视图模拟的演示者,使用模拟视图引发事件并验证演示者上事件处理程序的效果,而不是验证是否已运行这些代码行。事实上,这应该是您首先测试演示者的方式。它测试事件是否已订阅,以及处理程序正在执行它们应该执行的操作。