2012-01-31 18 views
1

我上面有一個方法的接口是這樣定義的:起訂量不及格的所有對象的方法

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() 

在這種情況下,我應該如何設置我的模擬對象?

回答

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); 
} 
+0

奇怪,當我在LinqPad運行例如運行良好。當我從我的項目中提取我的代碼並在linq pad中運行它時,它運行良好。然而在我的項目中,模擬總是返回null。 – ilivewithian 2012-01-31 13:21:51

+0

您的行是'Returns >(x => sprocReturnValue)'。將其更改爲'Returns(sprocReturnValue)'。即使你想訪問調用參數,你有兩個參數(query,param),並且只指定一個(x)。這是參數計數不匹配錯誤的原因。 – TrueWill 2012-01-31 16:58:15

相關問題