Как ожидать события, которое будет инициировано в тесте Silverlight

У меня есть ViewModel, который начинает загружать Модель, асинхронную в конструкторе, и инициировал событие, когда Модель загружается. Я получил тест, работающий с платформой модульного теста 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;
}

Но я начинаю играть с Платформой Rx и пытаться заставить мой тест работать, но до сих пор у меня нет удачи. Вот 2 попытки:

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

Первый тест входит в ожидание навсегда, второе не работает, потому что viewModel является пустым, когда это делает FromEvent.

У кого-либо есть подсказка о том, как сделать это правильно?

Обновление: вот рабочее решение со справкой от МН:

[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); 
           }); 
}
1
задан abatishchev 6 March 2012 в 08:45
поделиться

1 ответ

Я считаю, что вам все еще нужно использовать вызовы Enqueue. Например. примерно так:

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();
2
ответ дан 3 September 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: