Как проверить, получила ли функция конкретного делегата с помощью 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));
    }
}

Я также пытался использовать сопоставители аргументов, но это всегда терпит неудачу.


person alcohol is evil    schedule 14.02.2017    source источник
comment
Для справки NSubstitute — тестирование определенного выражения linq   -  person Jason Evans    schedule 14.02.2017
comment
Спасибо. Это не то, что я ожидал, но теперь я знаю, что это не так просто, как я думал.   -  person alcohol is evil    schedule 14.02.2017


Ответы (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) или вам достаточно поведения.

person zaitsman    schedule 27.02.2017