为什么我的异步命令调用单元测试不起作用?
Why my async command invocation unit test does not work?
好的,我已经花了几个小时弄清楚了,所以我决定在这里作为一个问题。
我正在使用 xUnit 和 Moq 框架。
关于我的 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);
好的,我已经花了几个小时弄清楚了,所以我决定在这里作为一个问题。
我正在使用 xUnit 和 Moq 框架。
关于我的 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>()
:
_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);