Почему при использовании Moq я не могу создать и проверить событие в моем приложении Windows Forms? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть приложение 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 не действует?

...