2013-10-25 5 views
0

Xamarin 및 ReactiveUI를 사용하여 모바일 앱을 수행합니다.ReactiveCommand 비동기 결과 테스트

ViewModelReactiveCommand을 테스트하고 싶습니다.

I는 ReactiveCommand 안에 IObservable을 반환하는 비동기 작업을 등록합니다. ViewModel 생성자에서

:

Login = new ReactiveCommand(); 
var loginResult = Login.RegisterAsync(_ => Client.Login(Username, Password)); 
loginResult.ObserveOn(RxApp.MainThreadScheduler).BindTo(this, self => self.ConnectedUser); 
Login 
    .Where(_ => ConnectedUser != null) 
    .Subscribe(_ => { 
     ConnectedUser.Disconnect(); 
     ConnectedUser = null; 
    }); 

Client.Login의 새로운 기능 :

return Observable.Start(async() => { 
    // Do an HTTP POST to login the user, with await stuff in 
    // Return the User on success or throw an exception on error 
}, RxApp.TaskpoolScheduler) 
.Select(task => task.Result); 

가 어떻게 ViewModel 로그인 성공을 테스트? 여기에 작동하지 않는 내 방법입니다 : 명령 실행이 완료되기 전에 주장이 이루어지기 때문에

[Test] 
public void TestLoginSuccess() 
{ 
    ViewModel viewModel = new ViewModel(); 
    viewModel.Username = "toto"; 
    viewModel.Password = "****"; 

    viewModel.Login.Execute(null); 

    Assert.That(viewModel.ConnectedUser, Is.Not.Null); // always null so fail :(
} 

시험은 실패합니다.

해상도

나는 Login 명령에 가입하고 내 "분리 블록"이 RegisterAsync의 하나 전에 호출 될 것이라고 가정 하였다. 두 문제를 해결하거나 같은 RegisterAsync 내부의 "분리"논리를 둘 것입니다 반전 :

var loginResult = Login.RegisterAsync(_ => { 
    if (ConnectedUser != null) 
    { 
     ConnectedUser.Disconnect(); 
     ConnectedUser = null; 
    } 
    Client.Login(Username, Password); 
}); 

Paul Betts '솔루션은 또한 필요했다.

+0

출력 창에서 로그를 추가 할 수 있습니까? 일반적으로 나는 ReactiveUI가 그 테스트 세트가 그 테스트가 즉각적으로 발견되었음을 알려주고 있습니다. – AlSki

답변

1

TaskPoolSchedulerScheduler.Immediate으로 설정되어 있지 않으므로 실제로 백그라운드에서 실행 중입니다. 이것을 시도하십시오 :

Scheduler.CurrentThread.With(sched => { 
    // TODO: Write your code here, now both schedulers are 
    // rigged to CurrentThread. 
}); 
+0

제대로 작업을 시퀀싱 (일부 중단 점을 사용하여 검사하고 올바른 순서로 트리거 됨)이지만 ConnectedUser에 대한 바인딩은 어설 션 전에 만들어지지 않은 것 같습니다. Login 명령을 실행하면 ConnectedUser가 null로 유지됩니다. – nverinaud