2009-02-24 5 views
3

Ok, j'ai un problème étrange. Je teste un usercontrol et ai le code comme ceci:L'installation/démontage de nunit ne fonctionne pas?

[TestFixture] 
public myTestClass : UserControl 
{ 
    MyControl m_Control; 

    [Test] 
    public void TestMyControl() 
    { 
     m_Control = new MyControl(); 
     this.Controls.Add(m_Control); 

     Assert.That(/*SomethingOrOther*/) 
    } 
} 

Cela fonctionne très bien, mais quand je change à:

[TestFixture] 
public myTestClass : UserControl 
{ 
    MyControl m_Control; 

    [Setup] 
    public void Setup() 
    { 
     m_Control = new MyControl(); 
     this.Controls.Add(m_Control); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     this.Controls.Clear(); 
    } 

    [Test] 
    public void TestMyControl() 
    { 
     Assert.That(/*SomethingOrOther*/); 
    } 
} 

Je reçois un objet de référence non définie à une instance d'un objet. J'ai même sorti sur la console pour m'assurer que la configuration/démontage était en cours aux heures correctes, et ils étaient ... mais il n'augmente pas encore les commandes usercontrols.

modifier> Le code exact est:

[TestFixture] 
public class MoneyBoxTests : UserControl 
{ 
    private MoneyBox m_MoneyBox; 
    private TextBox m_TextBox; 

    #region "Setup/TearDown" 
    [SetUp] 
    public void Setup() 
    { 
     MoneyBox m_MoneyBox = new MoneyBox(); 
     TextBox m_TextBox = new TextBox(); 

     this.Controls.Add(m_MoneyBox); 
     this.Controls.Add(m_TextBox); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     this.Controls.Clear(); 
    } 
    #endregion 

    [Test] 
    public void AmountConvertsToDollarsOnLeave() 
    { 
     m_MoneyBox.Focus(); 
     m_MoneyBox.Text = "100"; 
     m_TextBox.Focus(); 

     Assert.That(m_MoneyBox.Text, Is.EqualTo("$100.00"), "Text isn't $100.00"); 
    } 

    [Test] 
    public void AmountStaysANumberAfterConvertToDollars() 
    { 
     m_MoneyBox.Focus(); 
     m_MoneyBox.Text = "100"; 
     m_TextBox.Focus(); 

     Assert.That(m_MoneyBox.Amount, Is.EqualTo(100), "Amount isn't 100"); 
    } 
} 

je reçois l'exception (s) à la demande m_MoneyBox.Focus() respectifs.

- Voir les commentaires Solved

Répondre

3

J'ai créé un scénario de test avec exactement la même mise en page que celle présentée ici, mais avec un TextBox au lieu d'un MyControl. J'ai également ajouté un constructeur et un déconstructeur et sorti toutes les différentes étapes de la console pour voir la séquence des événements. Cependant, je n'ai jamais eu d'exception de référence d'objet.

Dans le cas où cela vous intéresse, la séquence était [constructeur appelé], [configuration appelée], [test appelé], [démontage appelé]. La déconstruction ne produit jamais rien à l'écran pour une raison quelconque. À l'origine, je pensais que la propriété Controls sur myTestClass ne serait pas initialisée, mais sur mon test, je pense que cela a quelque chose à voir avec la construction de MyControl. Edit> J'ai ajouté l'accent sur mon TextBox dans mon test unitaire, mais toujours pas d'exception. Est-ce que votre MoneyBox a un traitement des événements en coulisse pendant le Focus? Cela pourrait être votre coupable.

+0

! Je l'ai compris. J'apprécie beaucoup votre contribution. Le problème était que je re-déclarais la tirelire/zone de texte dans l'installation (par opposition à juste le renouveler). –

+1

@SnOrfus: Cela est facile à faire lorsque vous faites la promotion d'un objet local dans un objet de classe entière.Ironiquement, vous l'avez bien dans votre pseudo-code. – Autodidact

3

de Joseph Vous avez pas dit où vous obtenez l'exception, ce qui aiderait - à quoi ressemble la trace de la pile comme?

Il est très étrange (IME) de dériver UserControl lorsque vous créez un test. Mis à part toute autre chose, je ne sais pas si NUnit va appeler Dispose pour vous à n'importe quel moment ... quel est le but ici? Ne pouvez-vous pas faire fonctionner vos tests avec un appareil de test «simple»?

2

J'ai eu exactement le même problème, alors mes excuses pour la réponse à ce vieux message. Le problème dans votre code (et le mien) est que vous créez 2 instances différentes pour MoneyBox et 2 autres pour TextBox. Ainsi, l'affectation initiale dans le programme d'installation est valide uniquement pour la méthode d'installation et out_of_scope dans les méthodes de test.

Dans la méthode d'installation, vous devez utiliser:

m_MoneyBox = new MoneyBox(); //GOOD 
m_TextBox = new TextBox(); //GOOD 

au lieu de

MoneyBox m_MoneyBox = new MoneyBox(); //BAD 
TextBox m_TextBox = new TextBox(); //BAD 

Juste pour quelqu'un qui pourrait avoir besoin à nouveau