使用MS Fakes时,如何应用索引?

时间:2014-03-06 16:43:35

标签: sharepoint microsoft-fakes typemock

我正在从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世界中,像这样的索引是非常标准的做法,我的测试代码肯定会做到并且似乎没有任何问题。我的问题是为什么我不能在我的测试中做到这一点?我已经尝试将垫片转换为SPListItem但是不允许 - 我想我在这里遗漏了一些东西。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以我找到了答案:

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。考虑到这一点这是有道理的,因为垫片实际上并不是从SPListItem派生而是它是一堆可以通过伪造框架连接到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");