Moq не передает все объекты методу

У меня есть интерфейс с методом, определенным следующим образом:

IEnumerable<dynamic> ExecuteDynamic(string query, object param = null)

Код, который я пытаюсь протестировать, вызывает такой интерфейс:

var result = _repository.ExecuteDynamic("cart_getNewXsession", new
{
    HTTP_USER_AGENT = _context.Request.UserAgent,
    RHID = _context.Request.UserHostAddress,
    scid = GetSourceCode(),
    wsid = _systemSettings.GetWSID(),
    HTTP_REFERER = _context.Request.UrlReferrer == null ? "" : _context.Request.UrlReferrer.ToString(),
    QUERY_STRING = _context.Request.Url.Query
});

Я пытаюсь издеваться над вызовом этого метода следующим образом:

var repository = new Mock<>();
var sprocReturnValue = (new[] { (dynamic)new { guid = "123456" } }).AsEnumerable();
repository.Setup(x => x.ExecuteDynamic("cart_getNewXsession", It.IsAny<object>()))
                        .Returns<IEnumerable<dynamic>>(x => sprocReturnValue);

Однако, когда я запускаю это в тесте, я получаю сообщение об ошибке:

System.Reflection.TargetParameterCountException : Parameter count mismatch.

    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
    at System.Delegate.DynamicInvokeImpl(Object[] args)
    at System.Delegate.DynamicInvoke(Object[] args)
    at Moq.Extensions.InvokePreserveStack(Delegate del, Object[] args)
    at Moq.MethodCallReturn`2.Execute(ICallContext call)
    at Moq.Interceptor.Intercept(ICallContext invocation)
    at Moq.Proxy.CastleProxyFactory.Interceptor.Intercept(IInvocation invocation)
    at Castle.DynamicProxy.AbstractInvocation.Proceed()
    at Castle.Proxies.IRepositoryProxy.ExecuteDynamic(String query, Object param)
    Services\SessionService.cs(68,0): at Core.Services.SessionService.GetNewXS()
    Services\SessionService.cs(49,0): at Core.Services.SessionService.BuildXS()
    Services\Session\BuildXS.cs(78,0): at Core.Tests.Services.Session.BuildXS.When_XS_In_Cookie_Use_XS_From_Cookie()

В этой ситуации, как мне настроить мой фиктивный объект?


person ilivewithian    schedule 31.01.2012    source источник


Ответы (1)


Проблема заключается в методе Returns.

Будет работать следующее (пример в LINQPad):

void Main()
{
    var repository = new Mock<IRepository>();
    var sprocReturnValue = (new[] { (dynamic)new { guid = "123456" } }).AsEnumerable();
    repository.Setup(x => x.ExecuteDynamic("cart_getNewXsession", It.IsAny<object>()))
              .Returns(sprocReturnValue);

    var _repository = repository.Object;
    var result = _repository.ExecuteDynamic("cart_getNewXsession", new { Whatever = 0 });

    Console.WriteLine(result.First().guid);  // 123456
}

public interface IRepository
{
    IEnumerable<dynamic> ExecuteDynamic(string query, object param = null);
}
person TrueWill    schedule 31.01.2012
comment
Странно, когда я запускаю ваш пример в LinqPad, он работает нормально. Когда я извлекаю свой код из своего проекта и запускаю его в панели linq, он работает нормально. Тем не менее, в контексте моего проекта макет всегда возвращает ноль. - person ilivewithian; 31.01.2012
comment
Ваша линия Returns<IEnumerable<dynamic>>(x => sprocReturnValue). Измените это на Returns(sprocReturnValue). Даже если вы хотите получить доступ к аргументам вызова, у вас есть два параметра (запрос, параметр) и вы указываете только один (x). Это является причиной ошибки несоответствия количества параметров. - person TrueWill; 31.01.2012