2009-08-14 2 views
0

Ниже приведен код проверки. view.QueryResultsGrid является System.Windows.Forms.DataGridView объект:Исключение выброса NUnit + Moq

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 accessor на макет, поэтому я не понимаю этого сообщения. Наконец, NUnit дает исключение: «ссылка на объект, не установленную на экземпляр объекта».

Любая помощь очень ценится!

Энди

ответ

1

Ну что ваш код делает, получение DataGridView из макета, а затем установив свойство SelectionMode на нем. Фактическая реализация DataGridView не находится под управлением Mocks, поэтому она не может перехватывать геттеры и сеттеры для SelectionMode.

Одна из проблем (как вы наверняка узнали) заключается в том, что 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); 
} 
+0

Спасибо за вашу помощь! – Andy

Смежные вопросы