Платформа Mocking, которая поддерживает макетирование метода с делегатом в качестве параметра - PullRequest
1 голос
/ 10 февраля 2012

Я был очень доволен Moq, пока мне не понадобилось протестировать метод, который принимает делегат в качестве параметра и получил исключение UnsupportedException.Проблема также упоминается здесь и в списке вопросов Moq .

Есть ли фреймворк, поддерживающий этот вид насмешек?

Например:

/// 
/// Interfaces
///

public interface IChannelFactory<T> {
    TReturn UseService<TReturn>(Func<T, TReturn> function);
}

public interface IService {
    int Calculate(int i);
}

///
/// Test
///

Mock<IChannelFactory<IService>> mock = new Mock<IChannelFactory<IService>>();

// This line results in UnsupportedException
mock.Setup(x => x.UseService(service => service.Calculate(It.IsAny<int>()))).Returns(10);

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

Я не совсем уверен, что вы пытаетесь сделать, но это компилируется и выполняется с использованием ваших интерфейсов с Moq 4:

var mock = new Mock<IChannelFactory<IService>>();

mock.Setup(x => x.UseService(It.IsAny<Func<IService, int>>())).Returns(10);

int result = mock.Object.UseService(x => 0);

Console.WriteLine(result);  // prints 10

См. Также этот ответ более сложный случай.

1 голос
/ 18 января 2013

Недавно я столкнулся с этой же проблемой, и вот как использовать moq (v4.0.10827) для проверки правильности метода и параметров.(Подсказка: вам нужно два слоя насмешек.)

//setup test input
int testInput = 1;
int someOutput = 10;

//Setup the service to expect a specific call with specific input
//output is irrelevant, because we won't be comparing it to anything
Mock<IService> mockService = new Mock<IService>(MockBehavior.Strict);
mockService.Setup(x => x.Calculate(testInput)).Returns(someOutput).Verifiable();

//Setup the factory to pass requests through to our mocked IService
//This uses a lambda expression in the return statement to call whatever delegate you provide on the IService mock
Mock<IChannelFactory<IService>> mockFactory = new Mock<IChannelFactory<IService>>(MockBehavior.Strict);
mockFactory.Setup(x => x.UseService(It.IsAny<Func<IService, int>>())).Returns((Func<IService, int> serviceCall) => serviceCall(mockService.Object)).Verifiable();

//Instantiate the object you're testing, and pass in the IChannelFactory
//then call whatever method that's being covered by the test
//
//var target = new object(mockFactory.Object);
//target.targetMethod(testInput);

//verifying the mocks is all that's needed for this unit test
//unless the value returned by the IService method is used for something
mockFactory.Verify();
mockService.Verify();
0 голосов
/ 10 февраля 2012

Посмотрите на Кротов. Он поддерживает делегатов как фиктивные.

Родинки

...