Как проверить, получила ли функция определенный делегат, используя NSubstitute?
Я хотел бы проверить, если функция получила конкретный делегат в качестве параметра. Возможно ли это в NUnit с NSubstitute?
Мой интерфейс:
public interface IMyInterface
{
void Sort(Func<IEnumerable<int>, IOrderedEnumerable<int>> f);
}
Мой тестовый класс:
[TestFixture]
public class Class1
{
[Test]
public void Sort_WhenCalled_CallsWithPassedArgument()
{
// Arrange
IMyInterface mock = Substitute.For<IMyInterface>();
// Act
mock.Sort(x => x.OrderBy(y => y));
// Assert
mock.Received().Sort(x => x.OrderBy(y => y));
}
}
Я также пытался с сопоставления аргументов, но это всегда не удается.
1 ответ
Проблема в том, что ваш тип аргумента Func<>
не Expression<Func<>>
, С помощью Expression вы можете просматривать дерево, проверять имена методов и т. Д.
Тем не менее, вы можете выполнить юнит-тест на конкретном примере для OrderBy
(например, в отличие от OrderByDescending()
потому что дано собрание целых 6,4
OrderBy()
всегда будет пересортировать его, чтобы быть 4,6
, Итак, следующие работы:
[TestFixture]
public class Class1
{
[Test]
public void Sort_WhenCalled_CallsWithPassedArgument()
{
// Arrange
IMyInterface mock = Substitute.For<IMyInterface>();
Func<IEnumerable<int>, IOrderedEnumerable<int>> func = null;
mock.WhenForAnyArgs(x => x.Sort(Arg.Any<Func<IEnumerable<int>, IOrderedEnumerable<int>>>())).Do(
x =>
{
func = x.Arg<Func<IEnumerable<int>, IOrderedEnumerable<int>>>();
});
// Act
mock.Sort(x => x.OrderBy(y => y));
// Assert
var result = func(new[] { 6, 4 });
Assert.That(result.FirstOrDefault(), Is.Not.EqualTo(6));
Assert.That(result.FirstOrDefault(), Is.EqualTo(4));
}
}
Конечно, логика несколько хрупкая, поэтому вам нужно решить, действительно ли вы хотите проверить, используется ли в функции точный метод (а затем, возможно, провести рефакторинг кода, чтобы позволить проверять этот конкретный метод другими средствами, или переключиться на Expression
) или вам просто достаточно поведения.