0

初めてASP.NET Core 2.0を使用する。外部DLLで自分のapiをテストして呼び出す方法

私は作成したDLLを参照するWebプロジェクトを持っています。この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

から参照されるように

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

を含めるようにConfigureServicesを更新? – aaronR

+0

こんにちは@aaronR、興味を表明してくれてありがとう。私はホストがStartUpクラスから派生したと仮定しました。 –

+0

@AndrewSimpsonあなたはルートの一部として電子メールとパスワードを持っていますが、それらを本文の内容として送信します。アクションのルートテンプレートに一致しないため、404が見つかりません。また、コアの場合は、フレームワークがパラメータを探す必要のあるパラメータ属性を指定する必要があります。 – Nkosi

答えて

1

あなたはルートの一部として電子メールとパスワードを持っていますが、本文のコンテンツとして送信します。アクションのルートテンプレートに一致しないため、404が見つかりません。

あなたはフレームワークがパラメータを探す必要があり、パラメータの属性を指定する必要がコアにもデータ

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

を保持するためのモデルを作成します。

今、あなたはまた、コントローラを使用して、コントローラが登録されていることを確認する必要があります別のアセンブリであることを述べたように、統合テスト

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); 

で行われ、要求と一致している必要があり

[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(); 
    } 
} 

ServiceCollectionStartupに設定して、フレームワークがコントローラの解決方法を認識できるようにします。あなたのテストプロジェクトは、APIのホスト名を知っているどのように次の答えASP.NET Core MVC controllers in separate assembly

関連する問題