I implemented the MVP pattern (MVC) in winforms C #.
My View and Presenter are the following (without all MVP glue):
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(() =>
{
});
View.Message = "Saved!"
}
I use MSTest for unit testing, and also NSubstitute for ridicule. I want to simulate a button click in a view in order to test the controller code View_SaveClicked, as shown below:
[TestMethod]
public void WhenSaveButtonClicked_ThenSaveMessageShouldBeShown()
{
View.SaveClicked += Raise.EventWith(new object(), new EventArgs());
Assert.AreEqual("Saved!", View.Message);
}
I can raise View.SaveClickedusing NSubstitute Raise.EventWith. However, the problem is that the code immediately jumps to Assertbefore the Presenter has time to save the message, but Asserta failure.
, , Thread.Sleep(500) Assert, , . , presenter.Save() , , "".
, , unit test, , async View_SaveClicked View/Presenter, .
?