抓我的头怎么做。
假设我有一个具有2个虚拟方法的具体类Foo
,Execute()
和GetFile()
。 Execute()
会致电GetFile
。我想确保当它发生时,GetFile()
将抛出Foo
应该以可测试的方式优雅地处理的几个不同的异常。
对于我的单元测试,我正在设想实例化DynamicProxy< Foo
>从castle项目中我拦截GetFile()
以抛出异常,然后调用DynamicProxy对象的Execute()
方法,并测试结果,但我看不到如何执行此操作。
这可行/实用吗?如果是这样,动态代理对象的创建会是什么样的?
答案 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。