Проблема в том, что ваш тип аргумента 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
) или вам достаточно поведения.
person
zaitsman
schedule
27.02.2017