2012-04-26 56 views
2

抓我的头如何做到这一点。单元测试的城堡类代理

假设我有一个具体的类Foo有2个虚拟方法,Execute()和。 Execute()将拨打GetFile。我想确保一旦这样做,GetFile()将抛出几个不同的例外,Foo应该以可测试的方式优雅地处理。

对于我的单元测试,我预想实例从城堡项目DynamicProxy < Foo>,我拦截GetFile()抛出异常,然后调用DynamicProxy对象的Execute()方法,并测试结果,但我不能看看如何做到这一点。

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

回答

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这将:

调用基类如果没有期望会覆盖 成员(即Rhino Mocks中的“部分模拟”),则实施:默认为false。

+0

杰出。正是我在找什么。 – 2012-04-26 17:27:07