C# 努尼特+;Moq抛出异常

C# 努尼特+;Moq抛出异常,c#,tdd,nunit,moq,C#,Tdd,Nunit,Moq,测试中的代码如下。view.QueryResultsGrid是System.Windows.Forms.DataGridView对象: public void SelectCheckedChanged(object sender, EventArgs e) { view.QueryResultsGrid.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect; } 正在尝试的测试: private Mock<IQu

测试中的代码如下。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());
}
私有模拟窗口;
对演示者演示者的私人查询;
/// 
///在运行任何测试之前运行一次
/// 
[TestFixtureSetUp]
public void TestFixtureSetUp()
{
//我们有兴趣在这里测试QueryFormPresenter类,但是我们
//不要真正关心QueryForm窗口(视图),因为其中几乎没有任何代码。
//因此,我们创建QueryForm视图的模拟,并将其传递给QueryFormPresenter以供使用。
mockWindow=newmock();
presenter=新的QueryFormPresenter(mockWindow.Object);
}
[测试]
公共空间最小起订量是硬的()
{
//安排
DataGridView d=新的DataGridView();
SetupGet(x=>x.QueryResultsGrid).Returns(d);
//表演
演示者。选择CheckedChanged(空,空);
//断言
//mockView.VerifyGet(x=>x.QueryResultsGrid.SelectionMode,Times.AtMostOnce());
mockWindow.VerifySet(x=>x.QueryResultsGrid.SelectionMode,Times.AtMostOnce());
}
如果我在测试代码行上放置断点,VS会告诉我:属性或索引器“Presenter.IQueryForm.QueryResults”不能在此上下文中使用,因为它缺少get访问器。然而,在测试中,我认为我是在mock上设置Get访问器,所以我不理解这个消息。最后,NUnit给出了一个“对象引用未设置为对象实例”异常

非常感谢您的帮助


Andy

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

其中一个问题(您可能已经发现)是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);
}
[测试]
public void selected checked_setmode to column header select(){
//安排
//模拟表单以返回存根网格
模拟形式=新模拟();
DataGridView grid=新建DataGridView();
grid.SelectionMode=DataGridViewSelectionMode.CellSelect;
form.SetupGet(f=>f.QueryResults).Returns(grid);
QueryFormPresenter presenter=新的QueryFormPresenter(form.Object);
//表演
演示者。选择CheckedChanged();
//断言
form.VerifyGet(f=>f.QueryResults);
Assert.AreEqual(DataGridViewSelectionMode.ColumnHeaderSelect,
grid.SelectionMode);
}