1

나는 나의 webapi를 테스트하기 위해 unittesting 프로젝트를 만들고 컨트롤러를 초기화 할 필요가 있다는 것은 생성자에서 dependency-injection으로 제공되는 IConfiguration을 수신하고 잘 작동한다는 것입니다.asp.net 코어에서 IConfiguration의 인스턴스를 얻는 방법은 무엇입니까?

하지만 수동으로 초기화하려면이 인스턴스를 가져올 방법이 없습니다.

동일한 프로젝트 내부에 unittest 프로젝트에서 초기화하려고합니다. 아마 닷넷 핵심 응용 프로그램에서 당신은 당신의 컨트롤러 나 다른 클래스에 IConfiguration의 인스턴스를 통과하지해야한다는 문에서 시작해야 것

public Controller(IConfiguration configuration) { _configuration = configuration; } 

답변

2

: 같은

컨트롤러가 보인다. IOtions<T>을 통해 주입 된 강력한 입력 설정을 사용해야합니다. 자세한 내용은이 문서를 참조하십시오 : Options pattern in ASP.NET Core.

옵션 패턴을 사용할 때 컨트롤러가 요구하는 설정에 대해 POCO가 있습니다. 이 설정은 다음 IOptions<T>에 랩 컨트롤러에 주입 객체 :

public class ControllerSettings 
{ 
    public string Setting1 { get; set; } 

    public int Setting2 { get; set; } 

    // ... 
} 

public class Controller 
{ 
    private readonly ControllerSettings _settings; 

    public Controller(IOptions<ControllerSettings> options) 
    { 
     _settings = options.Value; 
    } 
} 

는 그 다음이 단위 테스트에서 원하는 설정을 통과 할 매우 간단합니다. 그냥 설정 인스턴스를 작성 Moq 또는 NSubstitute처럼 사용할 수 조롱 프레임 워크의와 IOptions<T>에 포장 : 때때로이 프로젝트의 실제 구성을 사용하는 데 필요한 것

[TestMethod] 
public void SomeTest() 
{ 
    var settings = new ControllerSettings 
    { 
     Setting1 = "Some Value", 
     Setting2 = 123, 
    }; 

    var options = new Mock<IOptions<ControllerSettings>>(); 
    options.Setup(x => x.Value).Returns(settings); 

    var controller = new Controller(options.Object); 

    // ... 
} 

을, 예를 들어 통합 테스트를 개발할 때. 이 경우 ConfigurationBuilder 인스턴스를 만들고 테스트 된 코드와 동일한 구성 소스로 채울 수 있습니다.

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
// Duplicate here any configuration sources you use. 
configurationBuilder.AddJsonFile("AppSettings.json"); 
IConfiguration configuration = configurationBuilder.Build();