2016-10-06 6 views
2

私のネイティブの.Netビジュアルスタジオテストツールを使用しています。コントローラに渡されたものが認可を通過しない場合、この時点(コードの始めから)に、私は不正なステータスコードが設定されていることを確認しようとしています。ここに私のコントローラコードです。ステータスコードのmvcコントローラをテストする方法

public class HubspotController : Controller 
{ 
    [HttpPost] 
    public ActionResult FreeDemo(string json) 
    { 
     JObject jobject = JObject.Parse(json); 

     var password = jobject["person"]["password"]?.ToString(); 
     var username = jobject["person"]["username"]?.ToString(); 

     if (!AuthorizeUser(password, username)) 
     { 
      StatusUnauthorized(); 
     } 

     var resultStatus = new ResultStatus { Message = "success"}; 
     return Json(resultStatus, JsonRequestBehavior.AllowGet); 
    } 

    public ActionResult StatusUnauthorized() 
    { 
     return new HttpStatusCodeResult((int)HttpStatusCode.Unauthorized, "Unauthorized"); 
    } 

    private bool AuthorizeUser(string password, string username) 
    { 
     return false; 
    } 
} 

これは私のテストです。私と一緒にいてください、私は多くのテスト経験がないので、これを理解しようとしています。

[TestClass] 
public class HubspotControllerFixture 
{ 
    private Mock<HttpRequestBase> request; 
    private Mock<HttpContextBase> httpContext; 
    private Mock<HttpResponseBase> response; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     request = new Mock<HttpRequestBase>(); 
     request.SetupGet(r => r.ContentType).Returns("application/json"); 
     response = new Mock<HttpResponseBase>(); 
     httpContext = new Mock<HttpContextBase>(); 
     httpContext.SetupGet(c => c.Request).Returns(request.Object); 
     httpContext.SetupGet(x => x.Response).Returns(response.Object); 
    } 

    [TestMethod] 
    public void Status_Code_Gets_Set_To_Unauthorized() 
    { 
     var json = "{\"person\": {\"password\":\"abc123\", \"username\":\"user\", \"name\":\"test person\"}}"; 
     var controller = new HubspotController() 
     { 
      ControllerContext = new ControllerContext() 
      { 
       HttpContext = httpContext.Object 
      } 
     }; 
     controller.FreeDemo(json); 
     Assert.AreEqual(HttpStatusCode.Unauthorized, httpContext.Object.Response.StatusCode); 
    } 
} 

これを実行すると、エラーが発生します。私は間違って何をしていますか?

Assert.AreEqualに失敗しました。期待:<Unauthorized (System.Net.HttpStatusCode)>。実際:<0 (System.Int32)>

+0

のためのHttpContext嘲笑を必要としないよう、あなたのテストは今、私はあなたがしているとして、あなたがテストでHTTPコンテキストを使用することができます疑うこのようになります。あなたのテストコードのリクエスト/レスポンスシナリオでは本当にありません。 –

答えて

0

テストで間違ったオブジェクトが表示されています。このテストケースはHttpContextに影響を及ぼしません。テスト中のメソッドの結果をアサートする必要があります。

まず、ターゲットコントローラのアクションを更新する必要があります。

//...other code omitted for brevity 
if (!AuthorizeUser(password, username)) 
{ 
    return StatusUnauthorized(); 
} 
//...other code omitted for brevity 

、あなたが実際にこのテストケース

[TestMethod] 
public void Status_Code_Gets_Set_To_Unauthorized() { 
    //Arrange 
    var json = "{\"person\": {\"password\":\"abc123\", \"username\":\"user\", \"name\":\"test person\"}}"; 
    var controller = new HubspotController(); 
    var expected = (int)HttpStatusCode.Unauthorized; 
    //Act 
    var actionResult = controller.FreeDemo(json) as HttpStatusCodeResult; 
    //Assert 
    Assert.IsNotNull(actionResult); 
    Assert.AreEqual(expected, actionResult.StatusCode); 
} 
+0

私はそれについて疑問を抱いていましたが、何が返されたかは0であり、401ではなく、私は問題が深いと考えていました。しかし、私はとにかくアサーションを更新しました。今私は期待通りになる:<401>。実際:<0> –

+0

さらに深いです。それが「0」であるという事実はまた、あなたが間違ったことを比較していることを示している – Nkosi

0

私はあなたがreturn文が欠落していると思います。下記の更新されたコードを見てください。

public class HubspotController : Controller 
{ 
    [HttpPost] 
    public ActionResult FreeDemo(string json) 
    { 
     JObject jobject = JObject.Parse(json); 

     var password = jobject["person"]["password"]?.ToString(); 
     var username = jobject["person"]["username"]?.ToString(); 

     if (!AuthorizeUser(password, username)) 
     { 
      return StatusUnauthorized(); 
     } 

     var resultStatus = new ResultStatus { Message = "success"}; 
     return Json(resultStatus, JsonRequestBehavior.AllowGet); 
    } 

    public ActionResult StatusUnauthorized() 
    { 
     return new HttpStatusCodeResult((int)HttpStatusCode.Unauthorized, "Unauthorized"); 
    } 

    private bool AuthorizeUser(string password, string username) 
    { 
     return false; 
    } 
} 
+0

ああ、私はそれを参照してください。しかし、私がそのreturn文を追加しても、同じエラー/失敗が発生します。 –

関連する問題