Я создаю тест для метода контроллера MVC5. Я использую moq для теста. Меня интересует, как протестировать метод контроллера, который требует аутентификации и использует значение идентификатора пользователя, а не значение имени пользователя, чтобы принимать решения о том, какие данные показывать браузеру/клиенту.
Из того, что я исследовал до сих пор, существует значительное количество кода, доступного для moq имени пользователя, но не так много кода для значения идентификатора пользователя (в моем случае это выглядит как Guid). Я использую ASP.Net Identity в качестве управления учетными записями. Я также добавил OWIN для входа в Google и Facebook.
Я использую внедрение зависимостей (используя Unity), потому что кажется, что это единственный способ выполнить тесты, плюс DI позволяет использовать moq.
Вот пример тестового метода, который ищет возврат NotNull из метода контроллера:
Mock<ModelObject> CreateModelObjectFromHelper()
{
var ci = new Mock<ClaimsIdentity>();
var myHelper = new Mock<MyHelper>();
myHelper.Setup(x => x.GetCurrentUserId(ci.Object)).Returns("333c188b-b33a-4233-83bd-5ea3a3333333");
return new Mock<ModelObject>(myHelper.Object);
}
[TestMethod]
public async Task ExampleController_Method_NotNull()
{
Mock<ModelObject> o = CreateModelObjectFromHelper();
ExampleController controller = new ExampleController(o.Object as IModelObject);
ViewResult result = await controller.MethodName() as ViewResult;
//check for non null result
Assert.IsNotNull(result);
}
В методе GetCurrentUserId я запрашиваю у объекта User.Identity идентификатор пользователя, используя этот код:
var userIdClaim = user.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
userIdValue = userIdClaim.Value.ToString();
И этот метод предположительно заменяется на moq. Метод GetCurrentUserId — это виртуальный метод во вспомогательном классе (MyHelper), который является параметром конструктора для объекта модели (ModelObject), который является параметром конструктора для контроллера (ExampleController).
Что происходит в отладчике (Visual Studio 2013) для тестового метода, так это то, что объекты создаются в методе CreateModelObjectFromHelper, но при создании ExampleController в строке:
ExampleController controller = new ExampleController(o.Object as IModelObject);
Объект MyHelper moq'd становится нулевым. Я вижу, что объект имеет значение перед этим оператором, но в этом операторе объект MyHelper становится нулевым... и весь тест терпит неудачу. Я предполагаю, что это терпит неудачу, потому что трудно вызывать методы для объекта, который является нулевым.
Вопрос в том... что заставляет этот объект становиться нулевым?
Другой вопрос... возможно, есть лучший способ сделать это, и если да, то я был бы рад услышать предложение.
Спасибо