Изучение Moq и нужна помощь при тестировании результата обратного вызова. Структура: У меня есть объект DateManager
, который имеет зависимость от объекта DateServer
, который делает асинхронные вызовы на сервер.Тестирование обратного вызова с помощью Moq в C#
DateServer.GetValidDate
примет строку даты в yyyy-MM-dd
и выполнит данный обратный вызов со строкой в том же формате.
Как настроить макет сервера таким образом, чтобы прошел тест ниже? Простая макетная настройка будет заключаться в том, что мой макет DateServer просто вернет любую строку, предоставленную ему (в обратном вызове).
Вот мои настройки. Я думаю, что у меня большая часть этой структуры правильная, но нужна помощь в заполнении ???? в приведенном ниже коде. Если бы мне лучше проверить обратный вызов, тогда я тоже заинтересован в этом.
public interface IDateServer
{
// with a currencyPair (ie: USDCAD), verifies that the given date is
// valid for a potential transaction.
// Callback is used to process the returned result, which is a date string.
void GetValidDate(string currencyPair, string date, Action<string> callback);
}
public interface IDateManager
{
void GetDate(string currencyPair, string dateCode, Action<string> callback);
}
[TestClass]
public class DateManagerTests
{
[TestMethod]
public void GetDateTest()
{
ManualResetEvent ar = new ManualResetEvent(false);
Mock<IDateServer> server = new Mock<IDateServer>();
DateTime tradeDate = new DateTime(2016, 2, 17);
server.Setup(????);
IDateManager dm = new DateManager(tradeDate, server);
string ret = "";
dm.GetDate("USDCAD", "2016-02-17", (string s) =>
{
ret = s;
ar.Set();
});
ar.WaitOne();
Assert.AreEqual<string>(ret, "2016-02-17");
}
}
Итак, мы назвали 'dm.GetDate()', а затем 'Verify()' проверяет правильность вызова 'GetValidDate()'. Это имеет смысл, и для этого случая большая часть. Однако, что произойдет, если мой 'DateManager' будет манипулировать возвращенным результатом до последнего обратного вызова? Я все еще хочу проверить строку, возвращаемую в обратном вызове. Как это сделать? – gdbj
@gdbj AFAIK 'DateServer' - это тот, который должен вызывать обратный вызов. Итак, с точки зрения теста для «DateManager» нет необходимости проверять, действительно ли вызван обратный вызов.В отдельном тесте для 'DateServer' вы должны предоставить фиктивный обратный вызов (без макета) для' DateServer', как это было в вашем примере кода. Кроме того, если 'DateManager' в какой-то момент, как ожидается, вызовет обратный вызов, вы предоставите фиктивный обратный вызов и проверите, было ли это вызвано нужным количеством раз. Поскольку вызовы не могут возникнуть из mock 'DateServer', это был' DateManager'. – Markus
Да, теперь я вижу, что ты прав. Любые проверки утверждений не требуются, так как результат надуман самой установкой. Мне пришлось немного поработать над этим. – gdbj