代码之家  ›  专栏  ›  技术社区  ›  Anders Sewerin Johansen

使用Moq提供一个利用mock的具体对象

  •  0
  • Anders Sewerin Johansen  · 技术社区  · 1 年前

    我有一个接口 IConfig 它有几种访问配置值的方法。

    具体的实施方式如下

    // Sync versions
    public String GetValue(ISetting) => this.GetConfigValue(ISetting.StringValue);
    public Double GetValue(ISetting) => this.GetConfigValue(ISetting.DoubleValue);
    
    // Async versions
    public Task<String> GetValueAsync(ISetting) => this.GetConfigValueAsync(ISetting.StringValue);
    public Task<Double> GetValueAsync(ISetting) => this.GetConfigValueAsync(ISetting.DoubleValue);
    
    private IConfigValue GetValue(ISetting setting) {
    ...
    }
    
    private async Task<IConfigValue> GetValueAsync(ISetting setting) {
    ...
    }
    

    现在

    出于测试目的,我希望测试从类继承,这提供了模拟配置值的简单方法,而不必关心测试编写器使用的设置类型,以及它将以同步或异步方式解析。

    特别是:由于我们使用严格的mocking,如果测试编写器必须只模拟IConfig接口,那么他们需要知道配置值是以同步还是异步方式访问的。

    我想我会很聪明,做这样的事:

    • 创建一个实现IConfig的类
    • 让它利用具有Task GetValueAsync方法的接口
    • 在我的类上生成方法,模拟调用该类的返回值
    • 提供我的类作为IConfig的解析对象

    ……下面是这样的。

    但这似乎有些不雅

    有更好的方法吗?

    public interface IAsyncConfigValueProvider
    {
      Task<IConfigValue> GetValueAsync(ISetting setting);
    }
    
    protected void SetConfigValue(ISetting setting, String s)
    {
        this.AutoMock.Mock<IAsyncConfigValueProvider>().Setup(c => c.GetValueAsync(setting)).ReturnsAsync(new ConfigValue(s)):
    }
    
    
    public class FakeConfig : IConfig
    {
      public String GetValue(ISetting) => this.GetConfigValue(ISetting.StringValue);
      public Task<String> GetValueAsync(ISetting) => this.GetConfigValueAsync(ISetting.StringValue);
      
      private Task<IConfigValue> GetConfigValueAsync(ISetting setting)
      {
        return this.AutoMock.Resolve<IAsyncConfigValueProvider>(setting)
      }
    
      private IConfigValue GetConfigValue(ISetting setting)
      {
        // Implement via task factory and this.GetConfigValueAsync
      }
    }
    
    public class TestBase {
    
      public TestBase() 
      {
        // ...
        this.AutoMock.Provide<IConfig>(new FakeConfig(this.AutoMock));
        // ...
      }
    }
    
    
    0 回复  |  直到 1 年前