2017-02-14 3 views
0

Я хотел бы проверить, получил ли функция определенный делегат в качестве параметра. Возможно ли это в NUnit с NSubstitute?Как проверить, получила ли функция определенный делегат, используя 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)); 
    } 
} 

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

+2

Для справки [NSubstitute - Тестирование для конкретного выражения linq] (http://stackoverflow.com/questions/5654053/nsubstitute-testing-for-a-specific-linq-expression) –

+0

Спасибо. Это не то, что я ожидал, но теперь я знаю, что это не так просто, как я думал. –

ответ

0

Задача состоит в том, чтобы ваш тип аргумента был 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)); 
    } 
    } 

конечно, логика несколько хрупким, поэтому вам нужно решить, если вы действительно хотите, чтобы проверить, что точный метод используется в FUNC (а затем, возможно, реорганизовать код, позволяющий проверить этот конкретный метод другими способами или переключиться на Expression) или просто для вас достаточно поведения.

Смежные вопросы