Xamarin 및 ReactiveUI를 사용하여 모바일 앱을 수행합니다.ReactiveCommand 비동기 결과 테스트
ViewModel
및 ReactiveCommand
을 테스트하고 싶습니다.
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 '솔루션은 또한 필요했다.
출력 창에서 로그를 추가 할 수 있습니까? 일반적으로 나는 ReactiveUI가 그 테스트 세트가 그 테스트가 즉각적으로 발견되었음을 알려주고 있습니다. – AlSki