объект moq становится нулевым после назначения контроллеру

Я создаю тест для метода контроллера 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 становится нулевым... и весь тест терпит неудачу. Я предполагаю, что это терпит неудачу, потому что трудно вызывать методы для объекта, который является нулевым.

Вопрос в том... что заставляет этот объект становиться нулевым?

Другой вопрос... возможно, есть лучший способ сделать это, и если да, то я был бы рад услышать предложение.

Спасибо


person Bill    schedule 26.02.2015    source источник


Ответы (1)


Это так не работает. Вы пытаетесь создать макет макета макета...

Если ваш контроллер зависит только от IModelObject, создайте только Mock и установите его свойства/методы, чтобы вернуть то, что вам нужно в контроллере.

Без кода для IModelObject и того, как он используется в контроллере, трудно привести лучший пример.

person Sunny Milenov    schedule 28.02.2015