【问题标题】:Expected invocation on the mock once, but was 0 times: No setups configured?预期在模拟上调用一次,但为 0 次:没有配置设置?
【发布时间】:2018-10-30 18:05:21
【问题描述】:

我使用Moq 进行了以下 xunit 测试。

[Fact]
public void Presenter_Filter_ShouldFilterViewSearchList()
{
    var mockView = Mock.Get(mockSearchView);
    mockView.Setup(v => v.Ids).Returns("123");
    presenter.Filter();
    var mockRepo = Mock.Get(mockSearchRepository);
    Filter filter = new Filter { Ids = new List<string> { "123" } };
    mockRepo.Verify(r => r.GetSearchItems(5000, filter), Times.Once);
}

测试失败并显示以下消息。

预期在模拟上调用一次,但为 0 次:r => r.GetSearchItems(5000, Filter) 未配置任何设置。 执行的调用: ISearchRepository.GetSearchItems(5000) ISearchRepository.GetSearchItems(5000, 过滤器)

以下是测试的功能。并调用了ISearchRepository.GetSearchItems(5000, Filter)

public void Filter()
{
    var filter = new Filter {
        Name = _view.Name,
        Ids = _view.Ids?.Split(',').Select(x => x.Trim()).ToList(),
        Countries = _view.Countries?.Split(',').Select(x => x.Trim()).ToList(),
        Region = _view.Region,
    };
    _repository.GetSearchItems(5000, filter);
}

【问题讨论】:

  • 您实际上在哪里让被测系统使用您创建的模拟存储库?

标签: c# moq xunit


【解决方案1】:

您的函数正在创建自己的过滤器:

var filter = new Filter {
    Name = _view.Name,
    Ids = _view.Ids?.Split(',').Select(x => x.Trim()).ToList(),
    Countries = _view.Countries?.Split(',').Select(x => x.Trim()).ToList(),
    Region = _view.Region,
};

您正在使用过滤器的不同实例设置测试:

Filter filter = new Filter { Ids = new List<string> { "123" } };
mockRepo.Verify(r => r.GetSearchItems(5000, filter), Times.Once);

如果你想测试调用,传递的对象必须是同一个对象。

否则,将其配置为使用任何Filter 对象进行调用:

 mockRepo.Verify(r => r.GetSearchItems(5000, It.IsAny<Filter>()), Times.Once);

或者将过滤器作为参数传递给函数:

public void Filter(Filter filter) 
{
    _repository.GetSearchItems(5000, filter);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多