У меня есть приложение Windows Form, и в Form_Load EventHandler он устанавливает checkstate флажка, который отлично работает, когда я запускаю приложение. Но я также хочу, чтобы модульный тест подтвердил, что событие устанавливает флажок в соответствии со значением базы данных, как ожидалось. Однако в моем модульном тесте .Raise
фреймворка moq, похоже, не запускает событие, поскольку я вообще не могу получить какой-либо метод проверки для передачи.
Вот код:
IForm1
public interface IForm1
{
event EventHandler Load; //Assuming this exposes the Form's normal Load event to Test code
void Form1_Load(object sender, EventArgs e);
DataSet LoadData();
CheckState MyCheckboxValue{ get; set; }
}
Form1
public partial class Form1 : Form, IForm1
{
public CheckState MyCheckboxValue
{
get => checkBox1.CheckState;
set => checkBox1.CheckState = value;
}
public Form1()
{
InitializeComponent();
this.Load += new System.EventHandler(this.Form1_Load);
}
public void Form1_Load(object sender, EventArgs e)
{
DataSet ds = LoadData();
checkBox1.CheckState = ds.Tables[0].Rows[0]["IndicatorName"] == "Y" ? CheckState.Checked : CheckState.Unchecked;
}
public DataSet LoadData()
{
//Dumbing down real-world scenario of reading a value from database
//For this demo code, lets dummy load 1 in-memory value
var dt = new DataTable("");
dt.Columns.Add("IndicatorName", typeof(string));
dt.Rows.Add("Y");
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
}
The Test
public class Form1Should
{
[Fact]
public void SetCheckboxCheckedWhenDatasetIndicatorIsY()
{
// Arrange
var dt = new DataTable("");
dt.Columns.Add("CheckState", typeof(string));
dt.Rows.Add("Y");
DataSet m_ds = new DataSet();
m_ds.Tables.Add(dt);
var mockForm1 = new Mock<IForm1>();
// Various attempts to do setups related to the event so verify tests below will work
mockForm1.SetupAdd(m => m.Load += new System.EventHandler(mockForm1.Object.Form1_Load));
mockForm1.Setup(x => x.Form1_Load(this, EventArgs.Empty)).Verifiable(); // I think Verifiable() is required to verify this method is called further below?
mockForm1.Setup(x => x.LoadData()).Returns(m_ds);
// Act
mockForm1.Raise(x => x.Load += null, this, EventArgs.Empty);
//Assert - I can't get any of these to work:
mockForm1.Verify(x => x.Form1_Load(It.IsAny<object>(), It.IsAny<EventArgs>()));
mockForm1.Verify(x => x.LoadData());
mockForm1.VerifyAdd(x => x.Load += It.IsAny<EventHandler>());
mockForm1.VerifySet(x => x.MyCheckboxValue = CheckState.Checked, Times.Once);
}
}
Что я делаю не так? Почему .Raise
не действует?