我有一个接口
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));
// ...
}
}