填充密封的单一单身方法和MS Fakes

时间:2014-08-06 11:07:03

标签: c# microsoft-fakes

我有一个密封的单身人士Foo及其方法:

    public string GetFolderPath(FooFolder folder)
    {
        IBoo boo = this.GetBoo();
        return boo.GetFolderPath(folder);
    }

并希望使用GetFolderPath方法为FindFile方法编写测试,如下所示:

    [TestMethod]
    public void FindFile()
    {   
        string expectedPath = Path.Combine(Path.GetTempPath(), "TestPath");
        using (ShimsContext.Create())
        {
            Fakes.ShimFoo.AllInstances.GetFolderPathFolder
                = () => { return "C:\\...\\Temp"; };

        }
        string actualPath = WorkflowHelper.FindFile("TestPath");
        Assert.AreEqual(expectedPath, actualPath);
    }

问题是我收到以下编译错误:

委托不接受0参数

在一个类似的问题How to shim OpenFileDialog.ShowDialog method中,问题就这样解决了:

[TestMethod]
public void SomeTest()
{
    using (var context = ShimsContext.Create())
    {
        Nullable<bool> b2 = true;
        ShimCommonDialog.AllInstances.ShowDialog = (x) => b2;

        var sut = new Sut();

        var r = sut.SomeMethod();

        Assert.IsTrue(r);
    }
}

所以我尝试了同样的...根据GetFolderPath是一个带有1个参数的方法......

下一个问题是我收到以下编译错误:

委托不带1个参数

所以我的问题是:

是否有可能填补密封班级并特别是单身人士?如果是的话,我的错误是什么?

感谢您的期待

1 个答案:

答案 0 :(得分:4)

请注意,ShimsContext生命周期内分配的所有垫片将在ShimsContext处置后销毁。

在您的示例中,您在绑定WorkflowHelper.FindFile生命周期的使用块之外调用ShimsContext,因此Foo.GetFolderPath的填充定义不再有效并且调用FindFile将使用原始方法定义。

只需在using块内移动您的方法调用即可:

    using (ShimsContext.Create())
    {
        Fakes.ShimFoo.AllInstances.GetFolderPathFolder = ...; // your lambda expression

        string actualPath = WorkflowHelper.FindFile("TestPath");
    }
    Assert.AreEqual(expectedPath, actualPath);