如何设置IConfigurationRoot模拟返回值

Vir*_*odh 13 c# unit-testing moq xunit.net asp.net-core

我使用IConfigurationRoute来访问这样的目录.

if (type == "error") directory = _config.GetValue<string>("Directories:SomeDirectory");
Run Code Online (Sandbox Code Playgroud)

_config是在构造函数中注入的IConfigurationRoot.

我尝试了以下方式来模拟它.

        var mockConfigurationRoot = new Mock<IConfigurationRoot>();
        mockConfigurationRoot.Setup(c => c.GetValue<string>("Directories: SomeDirectory"))
            .Returns("SomeDirectory")
            .Verifiable();
        var config = mockConfigurationRoot.Object;
Run Code Online (Sandbox Code Playgroud)

问题是在运行测试时,Xunit会抛出异常说法

"System.NotSupportedException:Expression引用一个不属于模拟对象的方法"

我该如何解决这个问题?

小智 21

我是使用SetupGet方法完成的,如下所示.它适用于我,希望它有所帮助.

_configurationRoot = new Mock<IConfigurationRoot>();
_configurationRoot.SetupGet(x => x[It.IsAny<string>()]).Returns("the string you want to return");
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不起作用.另一种方法是不进行模拟:builder.AddInMemoryCollection(new Dictionary <string,string> {{"ConnectionStrings:DB","MyConnection"},{"MyKey","MyValue"}}); var config = builder.Build(); (20认同)

Sud*_*van 8

  1. 将appSettings.json复制到Test项目的根目录,并将其属性标记为Content,如果较新则复制。

  2. var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
          .AddEnvironmentVariables();
    ConfigurationManager.Configuration = builder.Build();
    
    Run Code Online (Sandbox Code Playgroud)
  3. ConfigurationManager是一个类,它具有静态属性Configuration。这样,整个应用程序都可以作为ConfigurationManager.Configuration []进行访问。