Как я блокирую Func <T, TResult> в Насмешках Носорога?

В то время как вся польза отвечает, большая часть работы arounds предложенный полагаются на C# 3.0

Так, ради полноты, я добавлю другое решение, которое не использует ни лямбд, ни типа Func (Предоставленный, что, как Matt Olenik упомянул в комментариях, можно было обобщить ниже делегатов в работе тот же путь.). Для тех, как я, кто может все еще работать с C# 2.0. Возможно, не лучшее решение, но это работает.

public class Example
{
    public delegate void DoStuffDelecate();
    public DoStuffDelecate DoStuff;
    public delegate void DoStuffWithDelecate(int n);
    public DoStuffWithDelecate DoStuffWithParameter;
    public delegate int DoStuffWithReturnDelecate();
    public DoStuffWithReturnDelecate DoStuffWithReturnValue;
}

class Program
{
    static int MethodWithReturnValue()
    {
        return 99;
    }
    static void MethodForDelecate()
    {
        Console.WriteLine("Did Stuff");
    }
    static void MethodForDelecate(int n)
    {
        Console.WriteLine("Did Stuff with parameter " + n);
    }


    static void Main(string[] args)
    {
        var x = new Example();
        x.DoStuff = MethodForDelecate;
        x.DoStuffWithParameter = MethodForDelecate;
        x.DoStuffWithReturnValue = MethodWithReturnValue;

        x.DoStuff();
        x.DoStuffWithParameter(10);
        int value = x.DoStuffWithReturnValue();
        Console.WriteLine("Return value " + value);
        Console.ReadLine();
    }
}
5
задан whatupdave 22 October 2009 в 01:17
поделиться

2 ответа

Используйте настраиваемый делегат Do, который принимает функцию, и проверьте это. Вы можете сделать это, преобразовав его в выражение и проанализировав дерево выражений, или просто запустите делегат с фиктивным вводом и протестируйте результаты.

Следующий код вызовет ошибку, если лямбда внутри RemoteCall () не содержит x => x.Execute ("test") - вы можете отказаться от идеи, чтобы заставить его делать именно то, что вы хотите.

public interface IExecute {
  void Execute(string input)
}
_connectionService
    .Stub(c => c.RemoteCall(null)).IgnoreArguments()
    .Do(new Func<Action<IExecute>,bool>( func => {
       var stub = MockRepository.GenerateStub<IExecute>();
       func(stub);
       stub.AssertWasCalled(x => x.Execute("test"));
       return true;
     }));;
3
ответ дан 14 December 2019 в 13:40
поделиться

Если вас не интересует точное значение параметра "test", вы можете использовать конструкцию Arg <> :

_connectionService.Stub(c => c.RemoteCall( Arg<Func<string, bool>>.Is.NotNull ))
                  .Return(true);
3
ответ дан 14 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: