【问题标题】:NUnit+Moq Throwing ExceptionNUnit+Moq 抛出异常
【发布时间】:2011-07-04 18:22:09
【问题描述】:

下面是被测代码。 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 会告诉我:属性或索引器 'Presenter.IQueryForm.QueryResults' 不能在此上下文中使用,因为它缺少 get 访问器。但是,在测试中,我以为我在模拟上设置了 Get 访问器,所以我不明白那个消息。最后,NUnit 给出一个:'object reference not set to an instance of an object' 异常。

非常感谢任何帮助!

安迪

【问题讨论】:

    标签: c# tdd nunit moq


    【解决方案1】:

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

    其中一个问题(您可能已经发现)是 DataGridView 并不是真正的 Mockable,因此您必须返回实际的实现、存根所有属性并使用它。

    下面的测试我通过了...

    [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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2017-07-11
      • 2015-04-03
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多