Я работаю над модульными тестами для бизнес-уровня приложения API, и у меня возникают проблемы при корректной проверке зависимостей / конфигурации.
CategoryBusiness
public class CategoryBusiness : BusinessBase, ICategoryBusiness
{
private IApiRequestHelper _Api { get; set; }
public CategoryBusiness(IApiRequestHelper Api)
{
_Api = Api;
}
public async Task<CategoryCollection> GetAllAsync(string client)
{
var method = "get_module_fields";
var payload = new
{
session = "",
module_name = "Tickets",
select_fields = new string[] { "product", "exceptions_list_c" }
};
var response = await _Api.ExecuteCommandAsync(method, payload, client);
// more stuff
return categories;
}
}
ApiRequestHelper
public class ApiRequestHelper : IApiRequestHelper
{
private readonly IConfiguration _configuration;
public ApiRequestHelper(IConfiguration configuration)
{
_configuration = configuration;
}
public async Task<Dictionary<string, dynamic>>
ExecuteCommandAsync(string method, object payload, string client)
{
var username = _configuration["Api:Username"];
var pass = _configuration["Api:Password"];
//
// more stuff
//
}
}
Оба они регистрируются в Bootstrap.cs
private static void RegisterBusinessDependencies(IServiceCollection
services, IConfiguration configuration)
{
services.AddScoped(o => new ApiRequestHelper(configuration));
services.AddScoped<ICategoryBusiness, CategoryBusiness>();
services.AddScoped<IApiRequestHelper, ApiRequestHelper>();
}
Я следовал инструкциям в этом сообщении в блоге https://weblog.west -wind.com / posts / 2018 / Feb / 18 / Доступ-Configuration-in-NET-Core-Test-Projects для доступа к значениям конфигурации в моем тестовом проекте.Тем не менее, я не смог правильно издеваться над ApiRequestHelper, который зависит от экземпляра IConfiguration.Это мои тестовые классы и обходной путь, к которому я пришел:
CategoryBusinessTests
[TestFixture]
public class CategoryBusinessTests
{
private FSIConfiguration _configuration;
private CategoryBusiness _categoryBusiness;
[SetUp]
public void Init()
{
_configuration = TestHelper.GetApplicationConfiguration(TestContext.CurrentContext.TestDirectory);
ApiRequestHelper helper = new ApiRequestHelper(_configuration);
_categoryBusiness = new CategoryBusiness(helper);
}
[Test]
public async Task GetAllAsync()
{
var result = await _categoryBusiness.GetAllAsync("");
var type = result.Primary.FirstOrDefault().GetType();
Assert.That(type, Is.EqualTo(typeof(Category)));
}
}
TestHelper
public class TestHelper
{
public static IConfigurationRoot GetIConfigurationRoot(string outputPath)
{
return new ConfigurationBuilder()
.SetBasePath(outputPath)
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
}
public static TestConfiguration GetApplicationConfiguration(string outputPath)
{
var configuration = new TestConfiguration();
var iConfig = GetIConfigurationRoot(outputPath);
iConfig.GetSection("Api").Bind(configuration);
return configuration;
}
}
public class TestConfiguration : IConfiguration
{
public string this[string key]
{
get { return this.GetType().GetProperty(key.Split(":")[1]).GetValue(this).ToString(); }
set { throw new NotImplementedException(); }
}
public string Url { get; set; }
public string Username { get; set; }
public string Password { get; set; }
// extra interface implementation
}
Это работает, но я чувствую, что это не такt правильный и чистый способ создания экземпляров классов ApiRequestHelper (и CategoryBusiness).Может ли кто-нибудь указать мне правильное направление в отношении того, как это сделать правильно?