2016-12-29 4 views
1

Я новичок в написании блок-теста. Я получаю ошибку на User.Identity. Я видел насмешку, это решение для этого, и я попытался, который не работает в моем случае. Я добавил мой кодНулевая ссылка на идентификатор пользователя

Мой контроллер

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

и ниже мой тест

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

Здесь я пройти userId в ViewModel.Logs.ApplicationLogViewModel, я понятия не имею, как это сделать ,

Как мне получить userId, проходящий через applicationLogViewModel?

+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, что-то вроде этого:

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

затем передать, что через конструктор к контроллеру, и использовать этот контекст для извлечения пользователя.

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, если вы хотите проверить, что ветвь перенаправления выполнена, вы можете проверить, что 'ActionResult' имеет тип' RedirectToRouteResult'. – Johnny

+0

после того, как я изменил результат Json на результат действия, переменная фактическая, получившая нулевую опорную ошибку. а также мне нужно перенаправить это на другую страницу в соответствии с данными контроллера. – Sriram