Вопрос для начинающих Moq о проверке - PullRequest
0 голосов
/ 27 сентября 2011

Я просто играю с Moq и не могу понять, как заставить звонок на Verify работать как положено.Кажется, моя проблема в том, что метод, который я вызываю на SUT, не вызывается.Вот мой код для тестирования:

public class ImageHandler : BaseHttpHandler
{
   public override void ProcessRequest(HttpContextBase context)
   {
       var person = new Person();

       this.DoPerson(person);

       context.Response.ContentType = "image/jpeg";

       if (context.Request.RawUrl.ToLower().Contains("jellyfish.jpg"))
       {
           context.Response.TransmitFile(@"C:\Temp\jf.jpg");
       }
       else if (context.Request.RawUrl.ToLower().Contains("koala.jpg"))
       {
           context.Response.TransmitFile(@"C:\Temp\k.jpg");
       }
       else
       {
           context.Response.Write("File not found.");
       }

   }

   public virtual void DoPerson(Person person)
   {

   }
}

Вот мой тест MSpec:

[Subject("Process")]
public class When_Given_Person
{
    private static Mock<HttpContextBase> httpContext;

    private static Mock<HttpRequestBase> httpRequest;

    private static Mock<HttpResponseBase> httpResponse;

    private static Mock<ImageHandler> mockSut;

    private static BaseHttpHandler sut;

    private Establish context = () =>
    {
        httpContext = new Mock<HttpContextBase>();
        httpResponse = new Mock<HttpResponseBase>();
        httpRequest = new Mock<HttpRequestBase>();
        mockSut = new Mock<ImageHandler>();

        httpContext.SetupGet(context => context.Response).Returns(httpResponse.Object);
        httpContext.SetupGet(context => context.Request).Returns(httpRequest.Object);

        httpRequest.SetupGet(r => r.RawUrl).Returns("http://logicsoftware/unkown.jpg");

        sut = mockSut.Object;
    };

    private Because of = () => sut.ProcessRequest(httpContext.Object);

    private It should_call_person_with_expected_age = () =>
        {
            mockSut.Verify(s => s.DoPerson(Moq.It.IsAny<Person>()),Times.AtLeastOnce());
        };
}

Это действительно простой материал, ничего особенного.Теперь, когда я запускаю тест, я получаю:

Ожидаемый вызов на макет хотя бы один раз, но так и не был выполнен: s => s.DoPerson (It.IsAny ()) Не настроены настройки.

Я полагаю, это связано с тем, что sut.ProcessRequest() фактически не вызывается - у меня есть точка останова в начале ProcessRequest (), но она никогда не срабатывает.Может кто-нибудь показать мне, как настроить мой mockSut, чтобы вызывался ProcessRequest().

Приветствия.Иак.

1 Ответ

2 голосов
/ 28 сентября 2011

Когда вы создаете Mock объекта с помощью Moq, он будет высмеивать весь объект и настраивать его так, чтобы он возвращал значения по умолчанию или ничего не делал для каждого метода и свойства. Так что sut.ProcessRequest, на самом деле ничего не будет делать: DoPerson никогда не будет вызван.

Вам нужно только макетировать зависимости для классов, которые вы хотите протестировать, но не сам класс.

...