Как правильно смоделировать зависимости / конфигурацию в .Net Core Nunit - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над модульными тестами для бизнес-уровня приложения 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).Может ли кто-нибудь указать мне правильное направление в отношении того, как это сделать правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...