繁体   English   中英

NUnit + Moq抛出异常

[英]NUnit+Moq Throwing Exception

被测代码如下。 view.QueryResultsGrid是一个System.Windows.Forms.DataGridView对象:

public void SelectCheckedChanged(object sender, EventArgs e)
{
    view.QueryResultsGrid.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
}

正在尝试测试:

private Mock<IQueryForm> mockWindow;
private QueryFormPresenter presenter;

/// <summary>
/// Runs ONCE prior to any tests running
/// </summary>
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
    //We're interested in testing the QueryFormPresenter class here, but we 
    //don't really care about the QueryForm window (view) since there is hardly any code in it.
    //Therefore, we create a mock of the QueryForm view, and pass it to the QueryFormPresenter to use.
    mockWindow = new Mock<IQueryForm>();
    presenter = new QueryFormPresenter(mockWindow.Object);
}


[Test]
public void Moq_Is_Hard()
{
    //Arrage
    DataGridView d = new DataGridView();
    mockWindow.SetupGet(x => x.QueryResultsGrid).Returns(d);

    //Act
    presenter.SelectCheckedChanged(null, null);

    //Assert
    //mockView.VerifyGet(x => x.QueryResultsGrid.SelectionMode, Times.AtMostOnce());
    mockWindow.VerifySet(x => x.QueryResultsGrid.SelectionMode, Times.AtMostOnce());
}

如果在测试的代码行上放置一个断点,VS会告诉我:由于缺少get访问器,因此无法在该上下文中使用属性或索引器“ Presenter.IQueryForm.QueryResults”。 但是,在测试中,我认为我是在模拟程序上设置Get访问器,因此我不理解该消息。 最后,NUnit提供了一个“对象引用未设置为对象实例”的异常。

任何帮助是极大的赞赏!

安迪

那么您的代码正在做的是从模拟中获取DataGridView,然后在其上设置SelectionMode属性。 DataGridView的实际实现不受Mocks的控制,因此它无法拦截SelectionMode的获取器和设置器。

问题之一(您可能已经发现)是DataGridView并不是真正可模拟的,因此您必须返回实际的实现,将所有属性存根并进行处理。

以下测试对我来说是合格的...

[Test]
public void SelectCheckedChanged_SetsModeToColumnHeaderSelect () {
    //Arrange
    //Mock the form to return a stubbed grid
    Mock<IQueryForm> form = new Mock<IQueryForm>();
    DataGridView grid = new DataGridView();
    grid.SelectionMode = DataGridViewSelectionMode.CellSelect;
    form.SetupGet(f => f.QueryResults).Returns(grid);
    QueryFormPresenter presenter = new QueryFormPresenter(form.Object);

    //Act
    presenter.SelectCheckedChanged();

    //Assert
    form.VerifyGet(f => f.QueryResults);
    Assert.AreEqual(DataGridViewSelectionMode.ColumnHeaderSelect, 
                    grid.SelectionMode);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM