【问题标题】: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。