Такова ситуация. У меня был асинхронный вызов, поэтому мне нужно было сделать для этого средний уровень, чтобы иметь возможность его протестировать.
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 или какого-либо другого, чтобы реализовать этот макет объекта. Затем я просто удалю свой фиктивный класс. Это возможно? Что вы предлагаете?