Moq - как смоделировать результат метода в методе начала тестирования - PullRequest
0 голосов
/ 25 января 2011

и заранее благодарю за любую помощь.

У меня есть метод, который я пытаюсь проверить.

Внутри этого метода есть вызов UserMembership.Validate () // пользовательское переопределение, но код еще не функционирует и выходит за рамки теста.

Поэтому я хочу смоделировать (используя moq) возвращаемый результат, чтобы действительный тест метода мог завершиться успешно..

Вот код

public LoginResponse Login(LoginRequest request)
{
    var response = new LoginResponse(request.RequestId);

    // Validate client tag and access token
    if (!ValidateRequest(request, response, Validate.ClientTag | Validate.AccessToken))
        return response;

    if (!UserMembership.ValidateUser(request.UserName, request.Password))
    {
        response.Acknowledge = AcknowledgeType.Failure;
        response.Messages = "Invalid username and/or password.";
        //response.MessageCode = -4;
        return response;
    }

    _userName = request.UserName;

    return response;
}

Итак, мой тест для LoginResponse (), но я хочу «подделать» возвращаемое значение UserMembership (bool) в true ...

Достаточно просто, я уверен, что вы, ребята.

TIA, Хью.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

Вы, вероятно, могли бы переименовать свой вопрос в «Как вы используете фальшивый фреймворк с модульным тестированием 99% времени», потому что вы на правильном пути, чтобы сделать именно это - очень типичное использование.

Вы захотите извлечь интерфейс из вашего класса UserMembership (щелкните правой кнопкой мыши внутри класса, выберите «рефакторинг», а затем «извлечь интерфейс»), а затем используйте Moq, чтобы создать фиктивные экземпляры этого интерфейса для использования в ваши тесты. Затем вы можете использовать Moq, чтобы «настроить» поведение этого макета, чтобы делать все, что вы хотите во время теста. Синтаксис будет выглядеть так:

var userMembershipMock = new Mock<IUserMembership>();
userMembershipMock.Setup(m=> m.ValidateUser(It.Is<string>(str=> str == "myUserName"), It.Is<string>(str=> str == "myPassword"))).Returns(true);

Затем вы создадите новый экземпляр вашего класса, передав его в свой фиктивный экземпляр IUserMembership (но, поскольку вы сделаете так, чтобы конструктор вашего класса принял аргумент типа интерфейса, ваш класс не будет заботиться о том, передаете ли вы его это макет или фактический экземпляр UserMembership

 MyClass myClass = new MyClass(userMembershipMock.Object);

, после чего вы можете начать тестировать поведение своего MyClass:

var request = new LoginRequest { UserName = "myUserName", Password = "myPassword" };
LoginResponse response = myClass.Login(request);

И тогда вы можете утверждать, что ответ вашего класса - это то, что вы ожидаете:

Assert.AreEqual(AcknowledgeType.Success, response.Acknowledge);

или вы можете проверить, что метод (или свойство) вашего макета был вызван так, как вы ожидали:

userMembershipMock.Verify(m=> m.ValidateUser(It.Is<string>(str=> str == "myUserName"), It.Is<string>(str=> str == "myPassword")), Times.Once());

и т. Д.

Страница быстрого запуска Moq является своего рода чтением на одной странице и может научить вас 99% всего, что вам нужно знать, чтобы его использовать.

0 голосов
/ 25 января 2011

Единственный способ, которым я могу придумать насмехаться над UserMembership в этом случае (при условии, что это не свойство), это использовать IoC фреймворк, такой как Castle Windsor или Ninject .Когда вы используете контейнер IoC, вы будете рефакторировать ваши вызовы на UserMembership в интерфейс (IUserMembership) и использовать контейнер для обеспечения реализации:

if (Container.Resolve<IUserMembership>().ValidateUser(request.UserName, request.Password))

Затем в настройке модульного теста вы зарегистрируетесьреализация IUserMembership в качестве фиктивного объекта:

var mock = new Mock<IUserMembership>();
Container.Register<IUserMemberhip>().Instance(mock.Object);

Вам также необходимо создать производственную реализацию.Если это стандартный класс UserMembership, эта реализация, вероятно, не будет делать ничего, кроме UserMembership.Хотя есть и другие способы подражать этому типу утки.

...