Модульное тестирование - контроллер не получает значения из фиктивной конфигурации IConfiguration в проекте ASP.NET Core Web API - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь выполнить модульное тестирование моего действия по входу в систему в ASP.NET Core Web API с помощью имитирующих сервисов, все макеты работают нормально, но когда я пытаюсь смоделировать мой IConfiguration файл, контроллер не получает значение из него.

Вот мой код модульного тестирования, который вызывает действие моего контроллера:

[Fact]
public async Task SignInTest()
{
    // Arrange
    var requestVM = new CustomerSignInRequestVM
    {
        EmailPhone = "03026993900",
        RegNum = "Abc123"
    };

    var config = new Mock<IConfiguration>();
    //HERE I AM SETTING ALL MY CONFIGURATION VALUES TO RETURN SOME FAKE VALUES

    //config.Setup(cf => cf.GetSection("Jwt:Encryptionkey").Value).Returns("01 02 03");    
    config.Setup(x => x.GetSection("Jwt:Encryptionkey").Value).Returns("abc");
    config.Setup(x => x.GetSection("Jwt:Issuer").Value).Returns("test.com");
    config.Setup(x => x.GetSection("Jwt:ExpiryTimeInMinutes").Value).Returns("Jwt:ExpiryTimeInMinutes");   

    //THIS MOCKING WORK FINE IN CONTROLLER ACTION
    var customerApplication = new Mock<ICustomerApplication>();
    customerApplication.Setup(app => app.GetCustomer(It.IsAny<SignIn>())).ReturnsAsync(GetCustomerMockData);

    var claimApplication = new Mock<IClaimApplication>();
    claimApplication.Setup(app => app.GetListByRole(It.IsAny<ApplicationRole>())).ReturnsAsync(new List<ApplicationClaim> { new ApplicationClaim { Active = true, ClaimCode = "AUC_GA", ClaimLabel = "Auction.GetAll" } });

    //I'm also injecting my IConfiguration object here in my controller setup

    var controller = new CustomerController(customerApplication.Object, null, claimApplication.Object, null, null, config.Object, null);

    // Act
    var response = await controller.SignIn(requestVM, new CancellationToken());
    var okObjectResult = response as OkObjectResult;

    // Assert
    Assert.Equal(200, okObjectResult.StatusCode);
}

, но когда я пытаюсь получить значения из внедренной IConfiguration службы внутри моего действия контроллера, как это:

var Issuer = Configuration["Jwt:Issuer"],

это возвращает null мне, я не уверен, что я делаю здесь неправильно.

1 Ответ

3 голосов
/ 29 марта 2019

Вы настроили x.GetSection("Jwt:Issuer").Value, а звоните Configuration["Jwt:Issuer"].Это две разные вещи и приведут к заявленной проблеме.

Вам лучше создать конфигурацию в памяти, которая обладает всеми необходимыми функциями, чем пытаться корректно все смоделировать.

//...

var fakeValues = new Dictionary<string, string>
{
    {"Jwt:Encryptionkey", "abc"},
    {"Jwt:Issuer", "test.com"},
    {"Jwt:ExpiryTimeInMinutes", "some value"}
};

IConfiguration config = new ConfigurationBuilder()
    .AddInMemoryCollection(fakeValues)
    .Build();

//...

var controller = new CustomerController(customerApplication.Object, null, 
        claimApplication.Object, null, null, config, null);

//...

Ссылка Конфигурация в ASP.NET Core

...