2013-05-15 2 views
2

J'ai une classe qui effectue certaines fonctions dans un thread différent. Je veux tester cette classe dans mon application MonoTouch. J'ai donc ajouté un test pour les projets de test. J'ai trouvé que MonoTouch n'attend pas que le test se termine, il dit simplement qu'il est "réussi" pendant que le test est en cours. Un exemple du cas est ci-dessous:Test MonoTouch des threads

[Test] 
public void ThreadTest() 
{ 
    Timer ApplicationTimer = new Timer {Enabled = true, Interval = 2500}; 
    ApplicationTimer.Elapsed += ApplicationTimer_Tick; 
} 

private void ApplicationTimer_Tick (object sender, ElapsedEventArgs e) 
{ 
    Assert.Fail("failing"); // by the time the debugger hits this point, the UI already says that all tests passed. which is totally wrong. 
} 

Toute aide serait appréciée.

Répondre

3

Ceci n'est pas un problème spécifique à MonoTouch - ce test échouerait dans tous les testrunners.

Un test qui attend cet événement async pourrait ressembler à:

 private ManualResetEvent _mre = new ManualResetEvent(false); 

     [Test] 
     public void ThreadTest() 
     { 
      Timer ApplicationTimer = new Timer {Enabled = true, Interval = 2500}; 
      ApplicationTimer.Elapsed += ApplicationTimer_Tick; 
      if (!_mre.WaitOne(3000)) 
      { 
       Assert.Fail("Timer was not signalled"); 
      } 
     } 

     private void ApplicationTimer_Tick (object sender, ElapsedEventArgs e) 
     { 
      _mre.Set();    
     } 

Mais vous devriez être très prudent par écrit ce genre de test pour vous assurer de ne pas verrouiller threads, les objets de réutilisation à travers les tests, etc.