0

처음으로 ASP.NET Core 2.0 사용.외부 DLL에서 내 API를 테스트하고 호출하는 방법

내가 만든 DLL을 참조하는 웹 프로젝트가 있습니다. 이 DLL에서

간단한 방법입니다 ...
namespace InformedWorkerApi 
{ 
    [Route("api/[controller]")] 
    public class RegistrationController: Controller 
    { 
     private readonly IAccountRepository _accountRepository; 
     public RegistrationController(IAccountRepository accountRepository) 
     { 
      _accountRepository = accountRepository; 
     } 

     [HttpPost()] 
     [Route("SignOn")] 
     public async Task<InformedWorkerModels.Account> SignOn([FromBody]SignOnRequest model) 
     { 
      return await _accountRepository.SignOn(model.EmailAddress, model.Password); 
     } 
    } 
} 

나는 또한 내 DLL을 참조하는 테스트 프로젝트 ...
[TestMethod] 
    public async Task SignOn() 
    { 

     var webHostBuilder = new WebHostBuilder() 
      .UseStartup<Startup>(); 

     using (var host = new TestServer(webHostBuilder)) 
     { 
      using (var client = host.CreateClient()) 
      { 
       var requestData = new SignOnRequest { EmailAddress = "emailAddress", Password= "password" }; 
       var content = new StringContent(JsonConvert.SerializeObject(requestData), Encoding.UTF8, "application/json"); 
       var response = await client.PostAsync("api/Registration/SignOn", content); 
       //do some asserts here 
      } 
     } 
    } 

내가 오류 상태 코드를 404하지 얻기를 만들었습니다 녹이다.

무엇이 잘못 되었습니까?

+0

어떻게이 프로젝트는 API의 호스트 이름을 알고 테스트 않습니다에서 참조로 ConfigureServices

services.AddMvc() .AddApplicationPart(typeof(RegistrationController).GetTypeInfo().Assembly) .AddControllersAsServices(); 

을 포함하도록 업데이트? – aaronR

+0

안녕하세요 @aaronR, 관심을 보여 주셔서 감사합니다. 호스트가 StartUp 클래스에서 파생 된 것으로 가정합니다. –

+0

@AndrewSimpson 경로의 일부로 이메일과 비밀번호를 가지고 있지만 본문의 내용으로 전송합니다. 액션에 대한 라우트 템플리트와 일치하지 않으므로 404 Not Found가 표시됩니다. 또한 코어의 경우 프레임 워크에서 매개 변수를 찾아야하는 매개 변수 속성을 지정해야합니다. – Nkosi

답변

1

경로의 일부로 이메일과 비밀번호를 가지고 있지만 본문의 콘텐츠로 전송합니다. 액션에 대한 라우트 템플리트와 일치하지 않으므로 404 Not Found가 표시됩니다.

데이터

public class SignOnRequest { 
    [Required] 
    public string emailAddress { get; set; } 
    [Required] 
    public string password { get; set; } 
} 

프레임 워크가 매개 변수를 찾아야하는 곳 또한이 매개 변수를 지정해야 할 핵심 속성

을 유지하기 위해 모델을 만듭니다. 당신은 또한 컨트롤러가 다른 어셈블리에 당신이 컨트롤러가 등록되어 있는지 확인 할 필요가 있음을 언급 한 바와 같이 요청을 지금과 일치해야

[Route("api/[controller]")] 
public class RegistrationController : Controller{ 

    [HttpPost()] 
    [Route("SignOn")] // Matches POST api/Registration/SignOn 
    public async Task<IActionResult> SignOn([FromBody]SignOnRequest model) { 
     if(ModelState.IsValid) {     
      var response = await _accountRepository.SignOn(model.emailAddress, model.password); 
      return Ok(response); 
     } 
     return BadRequest(); 
    } 
} 

는 통합 테스트

var requestData = new { emailAddress = "emailAddress", password = "password" }; 
var content = new StringContent(JsonConvert.SerializeObject(requestData), Encoding.UTF8, "application/json"); 
var response = await client.PostAsync("api/Registration/SignOn", content); 

에서 만들어지고 ServiceCollection 내에서 Startup으로 변경하여 프레임 워크가 컨트롤러를 해결하는 방법을 알고 있어야합니다. 다음과 같은 대답 ASP.NET Core MVC controllers in separate assembly

관련 문제