Подтвердить что ты не робот

Проверка делегата была вызвана с помощью Moq

у меня есть класс, который получает аргумент делегата. Этот класс вызывает этот делегат, и я хочу протестировать его с помощью Moq. Как я могу проверить, что этот метод был вызван?

пример класса:

public delegate void Foo(int number);

public class A
{
   int a = 5;

   public A(Foo myFoo)
   {
      myFoo(a);
   }
}

и я хочу проверить, что Фу был вызван. Спасибо.

4b9b3361

Ответ 1

Как использовать анонимную функцию? Он может действовать как встроенный макет здесь, вам не нужна насмешливая структура.

bool isDelegateCalled = false;
var a = new A(a => { isDelegateCalled = true});

//do something
Assert.True(isDelegateCalled);

Ответ 2

От это коммит Moq теперь поддерживает насмешку делегатов, для вашей ситуации вы сделаете так:

var fooMock = new Mock<Foo>();
var a = new A(fooMock.Object);

Затем вы можете проверить, вызван ли делегат:

fooMock.Verify(f => f(5), Times.Once);

Или:

fooMock.Verify(f => f(It.IsAny<int>()), Times.Once);

Ответ 3

Moq не поддерживает насмешливых делегатов. Но вы можете создать некоторый интерфейс с методом, который соответствует вашей подписке делегата:

public interface IBar
{
    void M(int number);
}

Затем создайте mock, который реализует этот интерфейс, и используйте этот макет для создания делегата:

Mock<IBar> bar = new Mock<IBar>();
Foo foo = new Foo(bar.Object.M); 
A a = new A(foo);
bar.Verify(x => x.M(5));   

После тренировки вы сможете проверить ожидания на вашем издеваемом объекте.

UPDATE: на самом деле вы можете просто передать bar.Object.M в свой sut, без создания экземпляра делегата Foo. Но в любом случае насмешливые делегаты требуют создания интерфейса.

Ответ 4

Вы можете сделать что-то вроде этого:

 public interface IWithFOOMethod
 {
     void FooAlikeMethod(int number);
 }

 Mock<IWithFOOMethod> myMock = new Mock<IWithFOOMethod>();

 A a = new A(myMock.Object.FooAlikeMethod);

 myMock.Verify(call => call.Foo(It.IsAny<int>()), Times.Once())

Ответ 5

Так как Moq не поддерживает насмехающихся делегатов, я обычно обрабатываю это с помощью чего-то вроде:

var list = new List<int> ();
var del = i => list.Add (i);
var a = new A(del);
list.ShouldContainOnly (new[] { 5 });

где предоставленный делегат выполняет несколько простых, поддающихся проверке действий.