【问题标题】:Castle Class Proxy for unit tests用于单元测试的 Castle 类代理
【发布时间】:2012-04-26 15:04:20
【问题描述】:

摸不着头脑怎么做。

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

对于我的单元测试,我设想从城堡项目中实例化一个 DynamicProxyFoo>,我在其中拦截 GetFile() 以引发异常,然后调用 DynamicProxy 对象的 Execute() 方法,并测试结果,但我不知道该怎么做。

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

【问题讨论】:

    标签: c# unit-testing castle-dynamicproxy


    【解决方案1】:

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

    这是一个使用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 即可:

    如果没有期望覆盖 成员(在 Rhino Mocks 中也称为“Partial Mocks”):默认为 false。

    【讨论】:

    • 优秀。正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2022-11-14
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多