Определите реализацию метода в фиктивном объекте с помощью Moq

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

request.BeginGetResponse(new AsyncCallback(LoginCallback), requestState);

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

public interface IRequestSender
    {
        void Send(HttpWebRequest request, AsyncCallback internalCallback, object requestState);
    }

Затем в реализации я могу использовать вызов, подобный приведенному выше, и я могу предоставить некоторый фиктивный класс для вызова моего метода обратного вызова независимо от того, является ли запрос действительным или нет. Мой фиктивный класс выглядит так.

public class RequestSenderMock : IRequestSender
    {
        public void Send(HttpWebRequest request, AsyncCallback internalCallback, object requestState)
        {
            var result = new Mock<IAsyncResult>();
            result.Setup(x => x.AsyncState).Returns(requestState);
            internalCallback(result.Object);
        }
    }

Теперь я могу легко создать фиктивный объект в своем модульном тесте и использовать его. Но когда я создаю

var sender = new Mock<RequestSenderMock>();

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

sender.Verify(x => x.Send(It.IsAny<HttpWebRequest>(), It.IsAny<AsyncCallback>(), It.IsAny<object>()), Times.Once());

Он говорит, что мой метод должен быть виртуальным. Есть ли способ сделать это, не делая мой метод виртуальным? Было бы лучше, если бы я мог каким-то образом указать реализацию метода при использовании интерфейса.

var sender = new Mock<IRequestSender>();

И это каким-то образом с помощью метода Setup или какого-либо другого, чтобы реализовать этот макет объекта. Затем я просто удалю свой фиктивный класс. Это возможно? Что вы предлагаете?

6
задан Vajda 26 July 2011 в 17:36
поделиться