Модель представления модульного тестирования, использующая SelectMany для вызова асинхронного метода в ReactiveUI - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в ReactiveUI и пытаюсь протестировать модель представления, которая выглядит следующим образом:

public interface IService
{
    Task<SessionModel> GetData(string id);
}

/// Provides a group of schedulers available to be used
public interface ISchedulers
{
    IScheduler Default { get; }
    IScheduler Dispatcher { get; }
}

public class MyVm : ReactiveObject
{
    IService service;

    public MyVm(ISchedulers schedulers, IService service)
    {
        this.service = service;
        this.session = this.WhenAnyValue(x => x.SessionId)
                           .SelectMany(SearchSession)
                           .ObserveOn(schedulers.Default)
                           .ToProperty(this, x => x.Session);
    }

    private async Task<SessionModel> SearchSession(string id)
    {
        return await this.service.GetData(id);
    }

    private string sessionId;
    public string SessionId
    {
        get => sessionId;
        set => this.RaiseAndSetIfChanged(ref sessionId, value);
    }


    readonly ObservableAsPropertyHelper<SessionModel> session;
    public SessionModel Session
    {
        get { return session.Value; }
    }

}

public class SessionModel { }

Я издеваюсь над вызовом службы, чтобы вернуть фиктивные данные, но не уверен, что мне нужно делать сTestScheduler, чтобы заставить SelectMany работать.

Вот тестовый класс, который показывает, как я бы создал тест для модели представления.Цель состоит в том, чтобы в конечном итоге иметь возможность проверить, установлена ​​ли модель:

[TestClass]
public class MyVmTests
{
    [TestMethod]
    public void CreateClass
    {
       var subject = new MyVm(/*pass in mocks*/);

       subject.SessionId="test";

       Assert.IsNotNull(subject.Session);
     }
}

1 Ответ

0 голосов
/ 23 октября 2018

Я не думаю, что использование TestScheduler необходимо.Следующие шаги для меня (с использованием Moq):

var mockSchedulers = new Mock<ISchedulers>();
mockSchedulers.Setup(s => s.Default).Returns(Scheduler.Immediate);
var id = "123";
var mockService = new Mock<IService>();
var returnSession = new SessionModel();
mockService.Setup(s => s.GetData(It.Is<string>(i => i == id)))
    .ReturnsAsync(returnSession);
var target = new MyVm(mockSchedulers.Object, mockService.Object);

target.SessionId = id;

Assert.IsNotNull(target.Session);
Assert.AreEqual(returnSession, target.Session);

TestScheduler лучше всего подходит, когда вы пытаетесь что-то проверить со временем (например, задержка, доказывающая, что задержка действительно произошла).Вы на самом деле не делаете это здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...