Testing async method call from constructor
Trying to load the data asynchronously in the constructor is a bad idea and in my opinion goes against what the constructor is for.

Constructors cannot be async, and asynchronous initialization can be seen as an implementation detail.

I suggest separating the initialization and data loading out ...

public class MainVM : ViewModelBase {
    private readonly IRepository&lt;ToDoItem&gt; repository;
    private IEnumerable&lt;ToDoItem&gt; items;    
    private bool _dataIsLoaded;
    private bool loading = false;

    public bool DataIsLoaded {
        get { return _dataIsLoaded; }
        set { Set(ref _dataIsLoaded, value, true); }
    }

    public IEnumerable&lt;ToDoItem&gt; ToDoItems {
        get { return items; }
        set { Set(ref items, value); }
    }

    public MainVM(IRepository&lt;ToDoItem&gt; repository) {
        this.repository = repository;
    }

    public async Task LoadData() {
        if (loading) return;

        if (!DataIsLoaded) {
            try {
                loading = true;
                ToDoItems = await repository.GetAsync();
                loading = false;
                DataIsLoaded = true; // task Ran To Completion
            } catch (Exception ex) {
                loading = false;
                //TODO: Log error
                DataIsLoaded = false; // task did not complete
            }
        }
    }
}


... and have whatever is binding/using to the view model (ie the view, another model, a test, etc) load the data after initialization.

This allows the testing to be much simpler and to the point

For example

[TestClass]
public class MainVmTests {
    [TestMethod]
    public async Task DataIsLoaded_is_true_if_loading_task_ran_to_completion() {
        //Arrange
        var repoMock = new Mock&lt;IRepository&lt;ToDoItem&gt;&gt;();
        repoMock.Setup(_ =&gt; _.GetAsync()).Returns(Task.FromResult(Enumerable.Empty&lt;ToDoItem&gt;()));
        var subject = new MainVM(repoMock.Object);

        //Act
        await subject.LoadData();

        //Assert
        Assert.IsTrue(subject.DataIsLoaded);
        Assert.IsNotNull(subject.ToDoItems);
    }

    [TestMethod]
    public async Task DataIsLoaded_is_false_if_loading_task_failed() {
        //Arrange
        var repoMock = new Mock&lt;IRepository&lt;ToDoItem&gt;&gt;();
        repoMock.Setup(_ =&gt; _.GetAsync()).Throws(new AggregateException());
        var subject = new MainVM(repoMock.Object);

        //Act
        await subject.LoadData();

        //Assert
        Assert.IsFalse(subject.DataIsLoaded);
        Assert.IsNull(subject.ToDoItems);
    }
}