Как проверить, получила ли функция определенный делегат, используя 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,4OrderBy() всегда будет пересортировать его, чтобы быть 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) или вам просто достаточно поведения.

Другие вопросы по тегам