2009-08-14 9 views
0

Le code testé est le suivant. view.QueryResultsGrid est un objet System.Windows.Forms.DataGridView:Exception de lancement NUnit + Moq

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

test tentée:

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

Si je mets un point d'arrêt sur la ligne de code en cours de test, VS me dit: La La propriété ou l'indexeur 'Presenter.IQueryForm.QueryResults' ne peut pas être utilisé dans ce contexte car il manque l'accesseur get. Cependant, dans le test, j'ai pensé que je mettais en place l'accesseur Get sur le simulacre, donc je ne comprends pas ce message. Enfin, NUnit donne une exception: 'référence d'objet non définie sur une instance d'un objet'.

Toute aide est grandement appréciée!

Andy

Répondre

1

Eh bien ce que votre code est en train de faire est d'obtenir le DataGridView de la maquette, puis définir la propriété SelectionMode sur elle. L'implémentation réelle de DataGridView n'est pas sous contrôle Mocks, donc il ne peut pas intercepter les getters et setters pour SelectionMode. L'un des problèmes (comme vous l'avez probablement découvert) est que DataGridView n'est pas réellement mockable, vous devez donc retourner l'implémentation réelle, supprimer toutes les propriétés et faire avec.

Le test passe ci-dessous pour moi ...

[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

Merci pour votre aide! – Andy