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