2017-11-30 25 views
0

作成操作のコントローラユニットテストを作成しようとしています ユニットからコントローラ作成アクションメソッドを呼び出すために現在のユーザIDを取得できませんテスト機能。 「System.NullReferenceException: 'オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というエラーが表示されます。 "コントローラMVCでの作成/編集操作の試行中C#

[HttpPost] 
     public ActionResult Create(TransactionCodeEditViewModel TransactionCodeViewModel) 
     { 
      TransactionCode transactioncode = new TransactionCode() 
      { 
       Number = TransactionCodeViewModel.Number, 
       Name = TransactionCodeViewModel.Name, 
       Description= TransactionCodeViewModel.Description, 
       IsActive = true 
      }; 
      if (ModelState.IsValid) 
      { 
       _TransactionCodeService.Add(transactioncode, User.Identity.Name); 
      } 
      else 
      { 
       return View(); 
      } 

      return RedirectToAction("Index"); 

どのように値をUser.Identity.Nameに渡して機能させるか。

答えて

0

ユーザーは、HttpContext.Userに直面するコントローラ上のプロパティです。

コントローラーの依存関係を模擬している場合は、必要なIPrincipalを返すことができます。

これは私がセットアップに使用して拡張メソッド私のコントローラである(この例では、FakeItEasyを使用しています)

public static void SetControllerContext(this Controller controller) 
    { 
     var identity = A.Fake<IIdentity>(); 
     A.CallTo(() => identity.Name).Returns("your user name"); 
     var principal = A.Fake<IPrincipal>(); 
     A.CallTo(() => principal.Identity).Returns(identity); 
     var fakeContext = A.Fake<HttpContextBase>(); 
     var fakeRequest = A.Fake<HttpRequestBase>(); 
     var fakeResponse = A.Fake<HttpResponseBase>(); 

     A.CallTo(() => fakeRequest.HttpMethod).Returns(HttpVerbs.Post.ToString()); 
     A.CallTo(() => fakeContext.Response).Returns(fakeResponse); 
     A.CallTo(() => fakeContext.Request).Returns(fakeRequest); 
     A.CallTo(() => fakeContext.User).Returns(principal); 

     var fakeRequestContext = new RequestContext(fakeContext, new RouteData()); 

     controller.ControllerContext = new ControllerContext(fakeRequestContext, controller); 
    } 
0

あなたは偽物を設定している場合は、@Franは良い解決策のように見えます。ここでは偽物のないものである:再利用する

セットアップ共有クラス:

public class ControllerContextMock 
{ 
    public ControllerContext GetContext(ControllerBase controllerBase) 
    { 
     var httpContext = new HttpContext(new HttpRequest(string.Empty, "http://reason.com", null), new HttpResponse(new StringWriter())); 
     var requestContext = new RequestContext(new HttpContextWrapper(httpContext), new RouteData()); 

     requestContext.HttpContext.User = new ClaimsPrincipal(new GenericPrincipal(new GenericIdentity("John Galt", "WindowsMock"), null)); 

     return new ControllerContext(requestContext, controllerBase); 
    } 
} 

その後、あなたのユニットテストからそれを呼び出す:

public void Index() 
{ 
    // Arrange 
    var controller = new HomeController(); 
    controller.ControllerContext = new ControllerContextMock().GetContext(controller); 

    // Act 
    var result = controller.Create() as ViewResult; 

    // Assert 
    Assert.IsNotNull(result); 
} 
関連する問題