为什么我的异步命令调用单元测试不起作用?

Why my async command invocation unit test does not work?

好的,我已经花了几个小时弄清楚了,所以我决定在这里作为一个问题。

我正在使用 xUnitMoq 框架。

关于我的 SUT 的几句话。我有一个异步命令:

public IAsyncCommand SimulateResultsCommand { get; private set; }

命令调用方法:

SimulateResultsCommand = new AsyncCommand(async () => await OnSimulateResultsExecuteAsync());

方法是调用服务层方法:

public async Task OnSimulateResultsExecuteAsync()
{
    //init controls here

    Races = await _simulateDataService.SimulateResultsAsync(It.IsAny<int>(), Races.Count, Races, Horses, Jockeys, RaceModelProvider);

    //reset controls here
}

关于创建异步命令,我参考了。问题是,当我测试它时,测试失败并显示一条消息:

Message: Moq.MockException : Expected invocation on the mock once, but was 0 times: sd => sd.SimulateResultsAsync(It.IsAny(), 0, [], [], [], RaceModel)

Performed invocations:

Mock (sd):

ISimulateService.SimulateResultsAsync(0, 0, [], [], [], RaceModel)

测试看起来像这样:

[Fact]
public async Task OnSimulateResultsExecuteAsync_CallsSimulateResultsAsync()
{
    List<RaceDetails> races = new List<RaceDetails>();
    List<LoadedHorse> horses = new List<LoadedHorse>();
    List<LoadedJockey> jockeys = new List<LoadedJockey>();
    RaceModel race = new RaceModel();

    await _viewModel.SimulateResultsCommand.ExecuteAsync(null);

    _simulateDataMock.Verify(sd => sd.SimulateResultsAsync(0, races.Count, races, horses, jockeys, race), Times.Once);
}

模拟注入:

private MainViewModel _viewModel;
private Mock<ISimulateService> _simulateDataMock;

public MainViewModelTests()
{
    _simulateDataMock = new Mock<ISimulateService>();

    _viewModel = new MainViewModel(_simulateDataMock.Object);
}

我做错了什么?为什么 mock 上没有 调用?

您应该使用 It.IsAny<T>():

通过 any 值匹配参数
_simulateDataMock.Verify(sd => sd.SimulateResultsAsync(It.IsAny<int>(), It.IsAny<int>(),
    It.IsAny<List<RaceDetails>>(), It.IsAny<List<LoadedHorse>>(), It.IsAny<List<LoadedJockey>>(),
    It.IsAny<RaceModel>()), Times.Once);