2016-12-29 30 views
1

単体テストケースを書くのが初めてです。 User.Identityにエラーが表示されます。私は嘲笑がそれのための解決であることを見ました、そして、私は私の場合にはうまくいきませんでした。私はここでユーザーIDのヌル参照

[TestMethod()] 
public void createStage () 
{ 
    EnthiranStageViewModel enthiranStage = new EnthiranStageViewModel 
    { 
     StageType=0, 
     TriggerBeginType = Akton.Areas.Challenge.Models.TriggerType.Manual, 
     TriggerEndType= Akton.Areas.Challenge.Models.TriggerType.Manual, 
     TimeLimit = new TimeSpan(9, 6, 13), 
     TriggerBeginTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     TriggerEndTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     StartValueType= Akton.Areas.Challenge.Models.StartValueType.Global, 
     StageDate= new DateTime(2016, 09, 3, 9, 6, 13), 
     Proforma=25, 
     GameId=19, 
     CreatedTime=new DateTime(2016, 09, 3, 9, 6, 13), 
     UpdatedTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     StageName="Test", 

    }; 
    EnthiranController controller = new EnthiranController(); 
    JsonResult actual = controller.CreateStage(enthiranStage) as JsonResult; 
    var result = actual.Data; 
    Assert.AreEqual("{ success = True }", result.ToString()); 
} 

私はしているがViewModel.Logs.ApplicationLogViewModeluserIdを渡すために私のコード

マイコントローラー

public ActionResult CreateStage (EnthiranStageViewModel enthiranStage) 
{ 
    if (ModelState.IsValid) 
    { 
     Stage stage = enthiran.Insert_Stage(enthiranStage); 
     //logging Stage Creation 
     util.ApplicationLog(new ViewModel.Logs.ApplicationLogViewModel 
     { 
     GameCategorys = GameCategory.Enthiran, 
     Event = Events.EnthiranStageCreation, 
     SessionAttemptId = null, 
     UserId = User.Identity.GetUserId<int>(), 
     OptionalParameter1 = enthiranStage.GameId, 
     OptionalParameter2 = stage.Id, 
     Description = "Enthiran stage created" 
     }); 
     return RedirectToAction("Stages", new 
     { 
      id = stage.GameId 
     }); 
    } 
    return View(); 
} 

以下である私のテストケースを追加している、私はどのようにそれを行うには考えています。

userIdは、どのようにしてapplicationLogViewModelを通過しますか?

public interface IUserContext 
{ 
    public IPrincipal User {get;} 
} 

コントローラにコンストラクタによってそれを渡すと、ユーザーを取得するために、そのコンテキストを使用します。

+0

チェックhttps://stackoverflow.com/questions/40230776/how-to-mock-httpcontext-user/40234602#40234602 – Nkosi

+0

チェックhttp://stackoverflow.com/a/39453132/5233410 – Nkosi

+0

あなたはすべきまた、テスト中のメソッドがビュー結果を返すか、アクション結果にリダイレクトすることができますが、単体テストはJSON結果をチェックしていることに注意してください。 'actual'変数が' null 'になる – Nkosi

答えて

2

一つの解決策は、EnthiranControllerを変更して渡し、例えば、IUserContext、このようなものです。

ctor EnthiranController(IUserContext userContext) 

これらのすべてのインターフェイスを模擬するためにユニットテストを少し変更します。 JsonResultの代わりに、次の例に示すようにActionResultまたはRedirectToRouteResultを使用することもできます。

[TestMethod()] 
public void createStage () 
{ 
    //arrange 
    EnthiranStageViewModel enthiranStage = new EnthiranStageViewModel 
    { 
     StageType=0, 
     TriggerBeginType = Akton.Areas.Challenge.Models.TriggerType.Manual, 
     TriggerEndType= Akton.Areas.Challenge.Models.TriggerType.Manual, 
     TimeLimit = new TimeSpan(9, 6, 13), 
     TriggerBeginTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     TriggerEndTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     StartValueType= Akton.Areas.Challenge.Models.StartValueType.Global, 
     StageDate= new DateTime(2016, 09, 3, 9, 6, 13), 
     Proforma=25, 
     GameId=19, 
     CreatedTime=new DateTime(2016, 09, 3, 9, 6, 13), 
     UpdatedTime= new DateTime(2016, 09, 3, 9, 6, 13), 
     StageName="Test"  
    }; 

    Mock<IPrincipal> mockPrincipal = new Mock<IPrincipal>(); 
    //TODO: setup mockPrincipal 
    Mock<IUserContext> mockUserContext = new Mock<IUserContext>(); 
    mockUserContext.Setup(p => p.User).Returns(mockPrincipal.Object); 

    EnthiranController controller = new EnthiranController(mockUserContext.Object); 

    //act 
    var actual = controller.CreateStage(enthiranStage) as RedirectToRouteResult; 

    //assert 
    Assert.IsNotNull(actual); 
} 
+0

こんにちは、コメントのおかげで、うまく動作しますが、私はアクション結果を渡すとJsonの結果の代わりに知る必要があります。どのようにAssertを書くべきですか?たとえば私のコントローラでは、値を渡してページをリダイレクトしています。 – Sriram

+0

@Sriramもしあなたがredirect branchが実行されていることを確認したいなら、 'ActionResult'が' RedirectToRouteResult '型であることを確認することができます。 – Johnny

+0

私はJsonの結果をアクションの結果に変更すると、実際の変数はnull参照エラーを受け取ります。また、コントローラのデータごとに別のページにリダイレクトする必要があります。 – Sriram

関連する問題