用于单元测试的城堡类代理

时间:2012-04-26 15:04:21

标签: c# unit-testing castle-dynamicproxy

抓我的头怎么做。

假设我有一个具有2个虚拟方法的具体类FooExecute()GetFile()Execute()会致电GetFile。我想确保当它发生时,GetFile()将抛出Foo应该以可测试的方式优雅地处理的几个不同的异常。

对于我的单元测试,我正在设想实例化DynamicProxy< Foo>从castle项目中我拦截GetFile()以抛出异常,然后调用DynamicProxy对象的Execute()方法,并测试结果,但我看不到如何执行此操作。

这可行/实用吗?如果是这样,动态代理对象的创建会是什么样的?

1 个答案:

答案 0 :(得分:2)

您不需要手动编码自己的代理,因为大多数模拟框架都支持您的方案。

以下是使用Moq的示例(Moq将在内部为您创建动态代理):

public class SomeException : Exception { }

public class Foo
{
    public virtual int Execute()
    {
        try
        {
            GetFiles();
        }
        catch (SomeException)
        {
            return 1;
        }
        return 0;
    }

    public virtual void GetFiles()
    {
        //...
    }
}

[Test]
public void FooTest()
{
    var fooUnderTest = new Mock<Foo>();
    fooUnderTest.CallBase = true;
    fooUnderTest.Setup(f => f.GetFiles()).Throws(new SomeException());
    var result = fooUnderTest.Object.Execute();
    Assert.AreEqual(1, result);
}

您只需要注意设置Callbase = true即可:

  

如果没有期望覆盖,则调用基类实现   成员(a.k.a。&#34; Partial Mocks&#34;在Rhino Mocks中):默认为false。