c# - 在 Moq 中使用多个索引器

标签 c# unit-testing moq

我一直在尝试使用 Moq 来伪造具有多个索引器的对象集(并获取)。我以前使用带有单个索引器的 Moq 已经有一段时间了,但它似乎无法使用多个索引器。我从我的研究中了解到,使用 It.IsAny<> 作为索引器参数时,Moq 可能会出现问题,但我也尝试了以下带有特定参数的代码(如 mock[1, "BlockItem"]),这是我的代码:

m_storageAccessor.SetupSet(
mock => mock[It.IsAny<int>(), It.IsAny<string>()] = It.IsAny<object>()).Callback(
                (int i, string s, object o) =>
                       {
                           m_storageAccessor.SetupGet(
                               mock => mock[i, s]).Returns(
                                   () => { return o; });
                       });

无论我在 SetupSet() 中为索引器函数提供什么参数,这都会再次产生以下异常。

Initialization method UnitTest.BonusHandlerTest.MyTestInitialize threw exception. System.ArgumentNullException: System.ArgumentNullException: Value cannot be null. Parameter name: arguments.

System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodInfo method, ReadOnlyCollection1& arguments) System.Linq.Expressions.Expression.ValidateCallArgs(Expression instance, MethodInfo method, ReadOnlyCollection1& arguments) System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable1 arguments) System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments) TCall](Mock1 mock, Action1 setterExpression, Func5 callFactory) b__25() Moq.PexProtector.Invoke[T](Func1 function) Moq.Mock.SetupSet[T](Mock1 mock, Action1 setterExpression, Func1 condition) SetupSet(Action`1 setterExpression) UnitTest.BonusHandlerTest.SetupPersistence() in C:\perforce\dev\KHIRST_Client12.BonusHandler\Client12\Gaming\BonusHandler\UnitTest\BonusHandlerTest.cs: line 868 UnitTest.BonusHandlerTest.MyTestInitialize() in C:\perforce\dev\KHIRST_Client12.BonusHandler\Client12\Gaming\BonusHandler\UnitTest\BonusHandlerTest.cs: line 100

根据我的尝试,Moq 似乎无法使用多个参数创建索引器。有人有主意吗?互联网并没有太大帮助。

最佳答案

为了它的值(value),我设置了这个场景并且没有异常(exception):

        var myStub = new Mock<Foo>();
        myStub.SetupSet(foo => foo[12, "asdf"] = null).Callback((int i, string s, object o) => myStub.SetupGet(foo => foo[i, s]).Returns(o));

看来它不只是像 It.IsAny<> 那样用于索引器的参数,而且还用于设置值。我从未在测试中尝试这样做,但这似乎是该工具目前对我的限制。

关于c# - 在 Moq 中使用多个索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7877945/

相关文章:

java - 为什么具有 Android 依赖项的基类实例可以进行单元测试?

c# - 如何用最小起订量模拟 Microsoft.Office.Interop.Excel.Range?

wpf - MVVM 单元测试 - 消息总线只工作一次

c# - DataTable 列按 ASCII 顺序排序,而不是

c# - 将字节数组从 Unity C# 传递到 C++ 插件

c# - 为什么 MailDefinition 类需要 System.Web.UI.Control?

c# - 用于 JQuery 日期时间选择器的 ASP.Net 包装器控件

javascript - 如何确保 JS 匿名对象继续映射到 POCO ViewModels

python - 在 python 中使用装饰器跳过单元测试

c# - 工作 LINQ 查询在单元测试中不起作用