【发布时间】:2016-06-16 11:22:23
【问题描述】:
我已经在 c# winforms 中实现了 MVP (MVC) 模式。
我的 View 和 Presenter 如下(没有所有 MVP 胶水):
public interface IExampleView
{
event EventHandler<EventArgs> SaveClicked;
string Message {get; set; }
}
public partial class ExampleView : Form
{
public event EventHandler<EventArgs> SaveClicked;
string Message {
get { return txtMessage.Text; }
set { txtMessage.Text = value; }
}
private void btnSave_Click(object sender, EventArgs e)
{
if (SaveClicked != null) SaveClicked.Invoke(sender, e);
}
}
public class ExamplePresenter
{
public void OnLoad()
{
View.SaveClicked += View_SaveClicked;
}
private async void View_SaveClicked(object sender, EventArgs e)
{
await Task.Run(() =>
{
// Do save
});
View.Message = "Saved!"
}
我使用 MSTest 进行单元测试,同时使用 NSubstitute 进行模拟。我想在视图中模拟一个按钮单击来测试控制器的View_SaveClicked 代码,如下所示:
[TestMethod]
public void WhenSaveButtonClicked_ThenSaveMessageShouldBeShown()
{
// Arrange
// Act
View.SaveClicked += Raise.EventWith(new object(), new EventArgs());
// Assert
Assert.AreEqual("Saved!", View.Message);
}
我能够使用 NSubstitute 的 Raise.EventWith 成功提升 View.SaveClicked。但是,问题是代码在 Presenter 有时间保存消息之前立即转到 Assert 并且 Assert 失败。
我理解为什么会发生这种情况,并通过在Assert 之前添加Thread.Sleep(500) 来解决它,但这并不理想。我也可以更新我的视图以调用 presenter.Save() 方法,但我希望视图尽可能与 Presenter 无关。
所以想知道我可以改进单元测试以等待async View_SaveClicked 完成或更改 View/Presenter 代码以便在这种情况下更轻松地进行单元测试。
有什么想法吗?
【问题讨论】:
标签: c# winforms unit-testing events async-await