用于测试方法执行时间的 Moq 框架

Moq framework to test method execute times

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

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);
}

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

[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());
}

根据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 方法不需要任何参数。但是,您的 class 中有一个 filters-属性 未设置(至少不在您提供的代码中)。因此,您要么必须向方法签名添加适当的参数,要么设置 属性:

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