2010-04-23 9 views
1

J'ai un ViewModel qui commence à charger le modèle asynchrone dans le constructeur, et déclenche un événement lorsque le modèle est chargé. Je suis un test de travail avec le cadre de test unitaire silverlight, comme ceci:Comment attendre qu'un événement soit déclenché dans le test Silverlight

bool done = false; 

[TestMethod] 
[Asynchronous] 
public void Test_NoCustomerSelected() 
{ 
    ProjectListViewModel viewModel = null; 
    EnqueueCallback(() => viewModel = new ProjectListViewModel()); 
    EnqueueCallback(() => viewModel.ModelLoaded += new EventHandler<EventArgs>(viewModel_ModelLoaded)); 

    EnqueueConditional(() => done); 
    EnqueueCallback(() => Assert.IsNotNull(viewModel.FilteredProjectList)); 
    EnqueueCallback(() => Assert.AreEqual(4, viewModel.FilteredProjectList.Count)); 

    EnqueueTestComplete(); 
} 

void viewModel_ModelLoaded(object sender, EventArgs e) 
{ 
    done = true; 
} 

Mais je commence à jouer avec cadre Rx, et essayer d'obtenir mon test au travail, mais jusqu'à présent je n'ai pas de chance. Voici 2 tentatives:

public void Test_NoCustomerSelected2() 
{ 
    ProjectListViewModel viewModel = null; 
    viewModel = new ProjectListViewModel(eventAggregatorMock.Object, moduleManagerMock.Object); 

    IObservable<IEvent<EventArgs>> eventAsObservable = Observable.FromEvent<EventArgs>(
     ev => viewModel.ModelLoaded += ev, 
     ev => viewModel.ModelLoaded -= ev); 

    eventAsObservable.Subscribe(args => viewModel_ModelLoaded(args.Sender, args.EventArgs)); 
    eventAsObservable.First(); 

    Assert.IsNotNull(viewModel.Model); 
    Assert.AreEqual(4, viewModel.Model.Count); 
} 

[TestMethod] 
public void Test_NoCustomerSelected3() 
{ 
    ProjectListViewModel viewModel = null; 

    var o = Observable.Start(() => viewModel = new ProjectListViewModel(eventAggregatorMock.Object, moduleManagerMock.Object)); 

    IObservable<IEvent<EventArgs>> eventAsObservable = Observable.FromEvent<EventArgs>(
     ev => viewModel.ModelLoaded += ev, 
     ev => viewModel.ModelLoaded -= ev); 

    o.TakeUntil(eventAsObservable) 
      .First(); 

    Assert.IsNotNull(viewModel.Model); 
    Assert.AreEqual(4, viewModel.Model.Count); 
} 

Le premier test va dans l'attente pour toujours, la seconde ne fonctionne pas parce que le viewmodel est nulle quand il fait le FromEvent.

Quelqu'un a une idée sur la façon de le faire correctement?

Mise à jour: est ici une solution de travail avec l'aide de PL:

[TestMethod] 
public void Test_NoCustomerSelected4() 
{ 
    var viewModel = new ProjectListViewModel(eventAggregatorMock.Object, moduleManagerMock.Object); 

    Observable 
     .FromEvent<EventArgs>(viewModel, "ModelLoaded")) 
     .Take(1) 
     .Subscribe(e => 
      { 
       Assert.IsNotNull(viewModel.Model); 
       Assert.AreEqual(4, viewModel.Model.Count); 
      }); 
} 

Répondre

2

Je crois que vous avez encore à utiliser des appels Enqueue. Par exemple. quelque chose comme ceci:

var done = false; 
var viewModel = new ProjectListViewModel(eventAggregatorMock.Object, moduleManagerMock.Object); 

Observable 
    .FromEvent<EventArgs>(viewModel, "ModelLoaded")) 
    .Take(1) 
    .Subscribe(viewModel => 
     { 
      Assert.IsNotNull(viewModel.Model); 
      Assert.AreEqual(4, viewModel.Model.Count); 
      done = true; 
     }); 

EnqueueConditional(() => done); 
EnqueueTestComplete(); 
+0

Cela fonctionne, seulement des problèmes où j'ai dû changer .Subscribe (e => ...) et que le fait en Enqueue ne sont pas nécessaires. Merci PL. –