Я пытаюсь настроить функцию обратного вызова для универсального метода смоделированного объекта, который получает универсальный Func в качестве параметра. При этом он, кажется, не соответствует должным образом, так как обратный вызов никогда не вызывается и тест всегда завершается неудачей. Однако, если метод не имеет универсального Func, он работает. Это небольшое воспроизведение проблемы (фиктивное представление фактической проблемы):
public interface IFoo
{
void Bar<T>(T arg, Func<T, string> func);
}
public class FooTests
{
[Fact]
public void Test()
{
var bars = new List<object>();
var fooMock = new Mock<IFoo>();
fooMock.Setup(x => x.Bar(It.IsAny<It.IsAnyType>(), It.IsAny<Func<It.IsAnyType, string>>()))
.Callback((object arg, Func<It.IsAnyType, string> func) => bars.Add(arg));
fooMock.Object.Bar(4, (x) => "");
Assert.Single(bars); // This always results in "The collection was expected to contain a single element, but it was empty."
}
}
Кто-нибудь имеет представление о том, что не так или это можно сделать вообще с помощью Moq?
Редактировать : Как указывали другие, эта упрощенная версия проблемы не правильно отражала реальную проблему. Я попал в эту ветку Github и опубликовал рабочий код в этом комментарии . Это не полностью решает то, что я пытался сделать в методе Callback
, я хочу выполнить параметр formatter
, который передается методу Log
, но так как он вызывается с внутренним типом, у меня нетне нашел способ взять его из IInvocation.Arguments
и выполнить.