Как передать более 4 аргументов в FakeItEasy Invokes ()? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь преобразовать вспомогательный метод, который я написал, mocking ILogger с использованием Moq для FakeItEasy. Метод Log(), смоделированный в ILogger, требует 5 аргументов.

Log(LogLevel, EventId, FormattedLogValues, Exception, Func<object, Exception, string>)

Похоже, что FakeItEasy ограничил число аргументов до 4. (Из документов ):

// Pass up to 4 original call argument values into the method that creates the exception.
A.CallTo(()=>fakeShop.NumberOfSweetsSoldOn(A<DateTime>._))
  .Invokes((DateTime when) => System.Console.Out.WriteLine("showing sweet sales for " + when))
  .Returns(17);

Поэтому, когда я пишу этот код ...

var logs = new List<string>();
var logger = A.Fake<ILogger<ElasticSearchRepository>>();
A.CallTo(() => logger.Log(A<LogLevel>._, A<EventId>._, A<FormattedLogValues>._, A<Exception>._, A<Func<object, Exception, string>>._))
    .Invokes((LogLevel a, EventId b, FormattedLogValues x, Exception c, Func<object, Exception, string> d) => logs.Add(x.ToString()));

... Я получаю следующую ошибку

 Delegate 'Action<IFakeObjectCall>' does not take 5 arguments

Есть ли что-то, что я должен делать по-другому? Трудно представить, чтобы кто-то произвольно выбрал 4 в качестве максимального аргумента, который можно передать, поэтому я предполагаю, что есть причина. Moq's Callback() не имеет таких же ограничений.

1 Ответ

0 голосов
/ 16 ноября 2018

Похоже, что FakeItEasy ограничил число аргументов до 4.

Не совсем.Существуют вспомогательные перегрузки для максимум 4 аргументов, но на самом деле вы можете иметь любое количество аргументов, хотя и с менее удобным синтаксисом:

A.CallTo(() => logger.Log(A<LogLevel>._, A<EventId>._, A<FormattedLogValues>._, A<Exception>._, A<Func<object, Exception, string>>._))
    .Invokes(call => logs.Add(call.GetArgument<FormattedLogValues>("state").ToString()));
...