【问题标题】:Unit Testing - Controller not picking up value from mocked IConfiguration in ASP.NET Core Web API Project单元测试 - 控制器没有从 ASP.NET Core Web API 项目中的模拟 IConfiguration 中获取价值
【发布时间】:2019-03-29 21:48:49
【问题描述】:

我正在尝试使用模拟服务在 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);
}

但是当我尝试从 injected IConfiguration 服务在我的控制器操作中检索值时,如下所示:

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

这会将null 返回给我,我不确定我在这里做错了什么。

【问题讨论】:

  • 你设置了x.GetSection("Jwt:Issuer").Value 却调用了Configuration["Jwt:Issuer"]。这是两个不同的东西。您最好构建一个具有所有所需功能的内存配置,而不是尝试正确模拟所有内容。

标签: c# unit-testing asp.net-core asp.net-core-webapi


【解决方案1】:

您设置了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);

//...

参考Configuration in ASP.NET Core

【讨论】:

  • 完美!非常感谢这有效并达到目的! :) 干杯
猜你喜欢
  • 2018-07-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多