2014-05-14 1 views
0

Je suis perplexe ... Ceci est un suivi après à ma question précédente sur l'utilisation de délégués lambda avec la réflexion, à perform unit tests on Windows FormsPostSharp aspects Toolkit Threading affectant Windows Forms tests unitaires résultats

J'ai eu à travailler très bien et maintenant peut l'utiliser pour confirmer certains NFRs.

var monitor = new SemaphoreSlim(1); 
monitor.Wait(); 
var form = new SomeForm(); 
form.SetControlProperty<TextBox>("tbFirstName", "Text", firstName); 
form.SetControlProperty<TextBox>("tbLastName", "Text", lastName); 
form.ObserveControlEvents<DataGridView>("dataGridView1", "DataSourceChanged", 
    (sender, args) => 
    { 
     Trace.WriteLine("Occured in delegate"); 
     monitor.Release(); 
    }); 
Trace.WriteLine("Executing"); 
var sw = form.ClickButton("btnSearch"); 
monitor.Wait(); 
sw.Stop(); 

Cependant, si je décore ma recherche et les méthodes de mise à jour DataGridView.DataSource, avec [BackgroundMethod] et [DispatchedMethod], les tests réussissent, mais aucune donnée n'est insérée sous la forme sous test. En d'autres termes, les tests se terminent en 0ms, avec 0 enregistrements dans DataGridView. Je suis en train d'utiliser PostSharp 2.1.7.35 et 2.1.1.12 PostSharp Threading Toolkit.

Quelle pouvait être la raison de ce comportement?

J'ai essayé le chemin de la création d'une configuration de construction UnitTest et de l'utilisation du symbole de compilation SkipPostSharp, mais cela ne me semblait pas naturel à utiliser et j'avais d'autres problèmes.

MISE À JOUR

Si j'utilise l'approche usine de travail et accomplirai ma mise à jour de l'interface utilisateur sur un delegate, il fonctionne très bien.

MISE A JOUR 2

Il fonctionne aussi si j'utilise BackgroundWorker.

MISE A JOUR 3

En fait, BackgroundWorker n'a pas le feu correctement un événement sur l'exécution des tâches.

Alors, qu'est-ce que PostSharp tisse pour freiner les tests unitaires?

Répondre

-2

En utilisant this article advice, j'ai pu utiliser avec succès l'extension [BackgroundMethod] et SafeInvoke de PostSharp de l'article CodeProject. Comme il a quelques fautes de frappe, voici une nouvelle écriture:

public static TResult SafeInvoke<T,TResult>(this T isi, Func<T,TResult> call) where T : ISynchronizeInvoke 
    { 
     if (isi.InvokeRequired) { 
      IAsyncResult result = isi.BeginInvoke(call, new object[] { isi }); 
      object endResult = isi.EndInvoke(result); return (TResult)endResult; 
     } 
     else 
      return call(isi); 
    } 

    public static void SafeInvoke<T>(this T isi, Action<T> call) where T : ISynchronizeInvoke 
    { 
     if (isi.InvokeRequired) isi.BeginInvoke(call, new object[] { isi }); 
     else 
      call(isi); 
    } 

J'espère que cela sauve quelqu'un un certain temps.

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. –

+0

Hmm ... c'est ma propre réponse ... Et j'étais juste paresseux pour copier et coller le même code. – Darek

+0

Est-ce que c'est mieux? – Darek