moqing静态方法调用c#库类

时间:2010-03-09 06:21:54

标签: unit-testing refactoring moq

这似乎是一个很容易解决的问题,但我似乎无法找到影响我搜索的关键字。

我试图通过模拟这个方法调用中的所有对象来进行单元测试。除了这个之外,我能够为自己的所有创作做到这一点:

public void MyFunc(MyVarClass myVar)
{
    Image picture;
    ...

    picture = Image.FromStream(new MemoryStream(myVar.ImageStream));

    ...
}

FromStream是来自Image类的静态调用(c#的一部分)。那么我怎么能重构我的代码来模拟这个,因为我真的不想为单元测试提供图像流。

4 个答案:

答案 0 :(得分:3)

您可以创建IImageLoader接口。 “普通”实现只调用Image.FromStream,而单元测试版本可以做任何你需要它做的事情。

答案 1 :(得分:2)

Moq和大多数其他模拟框架不支持模拟静态方法。但是,TypeMock确实支持模拟静态方法,如果您愿意购买,可能会对您感兴趣。否则,你将不得不重构,以便可以模拟界面......

答案 2 :(得分:1)

您可以将静态函数包装到Func类型属性中,该属性可以通过模拟或存根的单元测试来设置。

public class MyClass
{
    ..

    public Func<Image, MemoryStream> ImageFromStream = 
                                     (stream) => Image.FromStream(stream);


    public void MyFunc(MyVarClass myVar)
    {
        ...

        picture = ImageFromStream(new MemoryStream(myVar.ImageStream));

        ...
    }


    ..
}

答案 3 :(得分:1)

这可以通过Visual Studio 2010 Power Tools Moles来实现。 Moles代码如下所示:

// replace Image.FromStream(MemoryStream) with a delegate
MImage.FromStreamMemoryStream = stream => null;