【问题标题】:Moq framework to test method execute times用于测试方法执行时间的 Moq 框架
【发布时间】:2016-05-30 07:25:11
【问题描述】:

请看我下面的代码,验证总是失败。有人可以帮忙吗?

public class ViewModel
{
    private IMyDataService dataService = null;

    public ViewModel(IMyDataService dataService)
    {
        this.dataService = dataService;
    }

    public Dictionary<string, string> filters {get; set;}

    public void ProcessFilters()
    {
        dataService.ProcessFilters(filters);
    }
}

[TestMethod]
public void ProcessFilters_Test()
{
    var mockService = new Mock<IMyDataService>();
    ViewModel vm = new ViewModel(mockService.Object);
    Dictionary<string,string> filters = null;
    vm.ProcessFilters(filters);
    mockService.Verify(x=>x.ProcessFilters(filters), Times.Once);
}

【问题讨论】:

  • 您的 filters-variable 始终为空,我认为这是问题所在
  • 我只测试 dataService.ProcessFilters 方法是否执行。我不在乎过滤器的价值。
  • 如果没有这个方法的代码,我们只能猜测哪里出了问题。你的代码会抛出异常吗?还是断言语句只是失败了?
  • 不,代码执行成功。只是验证测试方法说:预期在模拟上调用一次,但为 0 次:x=>x.ProcessFilters(filters)
  • 您尝试调试您的测试吗?那么应该很容易发现问题。

标签: c# unit-testing moq


【解决方案1】:

根据verify-a-method-call-using-moq,您必须先设置方法,然后才能验证它:

var mockService = new Mock<IMyDataService>();
mockService.Setup(mock => mock.ProcessFilter(null));
ViewModel vm = new ViewModel(mockService.Object);
Dictionary<string,string> filters = null;

// Act
vm.ProcessFilters(filters);

// Assert
mockService.Verify(x=>x.ProcessFilters(filters), Times.Once);

此外,ViewModel 中的 ProcessFilters 方法不需要任何参数。但是,您的班级中有一个 filters-property 未设置(至少不在您提供的代码中)。因此,您必须将适当的参数添加到方法签名或设置属性:

vm.Filters = filters;
vm.ProcessFilters();

【讨论】:

    【解决方案2】:

    请注意,属于ViewModel 类的ProcessFilters 方法不接受任何参数,因此您实际上并未调用该方法。如果您尝试测试属于ViewModel 类的ProcessFilters 方法是否使用filters 参数null 调用模拟IMyDataService 一次,然后尝试类似:

    [TestMethod]
    public void ProcessFilters_Test()
    {
        // Arrange.
        var mock = new Mock<IMyDataService>();
        var vm = new ViewModel(mock.Object);
    
        // Act.
        vm.ProcessFilters();
    
        // Assert.
        mock.Verify(s => s.ProcessFilters(null), Times.Once());
    }
    

    【讨论】:

    • 据我所知,这正是 OP 已经在做的事情,如果他直接提供 null 或通过变量 (filters) 提供没有区别。
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2019-01-30
    • 2012-10-19
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多