2

挠头怎么办。

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

对于我的单元测试,我设想Foo从 Castle 项目中实例化一个 DynamicProxy<>,我在其中拦截GetFile()以抛出异常,然后调用 DynamicProxy 对象的Execute()方法,并测试结果,但我不知道如何做到这一点。

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

4

1 回答 1

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 = truewhich 将:

如果没有期望覆盖成员(在 Rhino Mocks 中也称为“Partial Mocks”),则调用基类实现:默认为 false。

于 2012-04-26T16:12:27.350 回答