【问题标题】:When using MS Fakes, how can I apply indexing?使用 MS Fakes 时,如何应用索引?
【发布时间】:2014-03-06 16:43:35
【问题描述】:

我正在从 TypeMock 迁移到 MS Fakes。在 TypeMock 中,我可以做这样的事情:

var fakeItem = Isolate.Fake.Instance<SPListItem>();

//some testing foo that uses the fake item Eg.
MethodUnderTest(fakeItem);

Assert.AreEqual(fakeItem["someField"], expected, "Field value was not set correctly");

在我的断言中,我可以检索由我的测试 foo 设置的字段值,并将其与我的预期进行比较。

使用 MS Fakes 时,我会这样做:

var fakeItem = new ShimSPListItem()
            {
                //delegates in here
            };

//some testing foo that uses the shim. Eg.
MethodUnderTest(fakeItem);

这一次我尝试检查我的值是否已设置为:

Assert.AreEqual(fakeItem["someField"], expected, "Field value was not set correctly");

我最终得到一个编译错误:

Cannot apply indexing with [] to an expression of type 'Microsoft.SharePoint.Fakes.ShimSPListItem'  

在 SharePoint 世界中,这样的索引几乎是标准做法,我的测试代码确实可以做到,并且似乎可以正常工作,没有任何问题。我的问题是为什么我不能在我的测试中做到这一点?我已经尝试将 shim 投射到 SPListItem 但这是不允许的 - 我想我在这里遗漏了一些东西。有什么想法吗?

【问题讨论】:

    标签: sharepoint microsoft-fakes typemock


    【解决方案1】:

    所以我找到了答案:

    var fakeItem = new ShimSPListItem()
            {
                //delegates in here
            };
    MethodUnderTest(fakeItem);
    var item=fakeListItem as SPListItem;
    Assert.AreEqual(item["someField"], expected, "Field value was not set correctly");
    

    这不起作用 - 我无法使用“as”将 fakeListItem 转换为 SPListItem。考虑一下这是有道理的,因为 shim 实际上并不是从 SPListItem 派生的,而是一堆可以通过 fakes 框架连接到 SPListTem 的委托。

    这确实有效:

    var fakeItem = new ShimSPListItem()
            {
                //delegates in here
            };
    MethodUnderTest(fakeItem);
    var item=(SPListItem) fakeListItem;
    Assert.AreEqual(item["someField"], expected, "Field value was not set correctly");
    

    大概演员表允许自定义转换器运行,为我们提供我们需要的东西。

    TypeMock 迁移器可能更容易使用:

    SPListItem fakeItem = new ShimSPListItem()
            {
                //delegates in here
            };
    MethodUnderTest(fakeItem);
    Assert.AreEqual(fakeListItem["someField"], expected, "Field value was not set correctly");
    

    【讨论】:

    • 您知道,在 IL 中创建 shim 以重定向调用,而存根是派生类型(或实现),其中每个覆盖或实现都调用一个委托。您不需要经常使用 shim 的实例,但总是需要 stub 的实例。小心不要拿错了。
    • 感谢@Magus - 我认为在测试 SharePoint 内容时,我们可能更频繁地使用填充程序而不是存根,因为我们试图将被测代码与 SharePoint API 隔离开来,其中大部分不是可存根。我明白你关于理解两者之间区别的观点,我认为这对于 TypeMock 迁移者来说绝对是明确的(因为 TypeMock 没有相同的区别)
    • 即使您大量使用 shim,通常也不会使用实例来实现。这是我的主要观点。你似乎在传递垫片,这不是他们真正的工作方式。在 ShimsContext 中,您可以使用 shim 重新路由调用而不传递它。
    • 是的,我很欣赏您所说的,但在 SPListItem(和其他 SharePoint 对象)的情况下,我无法在不调用 SharePoint 平台或使用存根的情况下创建真实实例,因为这些类是密封的。在这些情况下,我别无选择,只能使用 shim 并允许 fakes 框架将 shim 转换为我的测试代码可以使用的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多