我正在使用犀牛嘲笑3.5并试图在我的期望中抛出异常来测试我的catch块中的某些功能。如何在新的犀牛嘲笑中抛出异常3.5
但由于某种原因,它没有抛出异常。
_xyz.stub(x => x.function(string)).throw(new exception("test string"));
因此,我正在调用函数来抛出异常,但它没有抛出异常。
我正在使用犀牛嘲笑3.5并试图在我的期望中抛出异常来测试我的catch块中的某些功能。如何在新的犀牛嘲笑中抛出异常3.5
但由于某种原因,它没有抛出异常。
_xyz.stub(x => x.function(string)).throw(new exception("test string"));
因此,我正在调用函数来抛出异常,但它没有抛出异常。
我不知道为什么它不适合你。我创建了一个小样本,它对我来说工作得很好。看看这段代码:
首先我创建了我想测试的代码。
public interface IXyz
{
void Foo();
}
public class Xyz : IXyz
{
public void Foo()
{
}
}
public class Sut
{
public void Bar(IXyz xyz)
{
xyz.Foo();
}
}
接下来我要创建一个测试方法。在这种情况下,我使用MbUnit,但它应该可以与任何单元测试框架一起使用。
[Test]
[ExpectedException(typeof(ArgumentException), Message = "test string")]
public void BarFoo_Exception()
{
IXyz xyzStub = MockRepository.GenerateStub<IXyz>();
xyzStub.Stub(x => x.Foo()).Throw(new ArgumentException("test string"));
new Sut().Bar(xyzStub);
}
我希望这有助于。
您可能需要发布更多信息和更多源代码。我的第一个猜测是,你所琢磨的方法在消费者中从未受到过打击。
当你浏览代码时,_xyz.function(string)被使用的地方会被击中吗?
是的,它被击中。但不知何故,它不返回异常。 – alice7 2010-01-05 20:09:27
看来,如果你想抛出异常的方法有参数,那么你需要在.Throw(new Exception())
之前加上.IgnoreArguments()
。
例如,我发现以下不会抛出异常:
queue.Stub(x => x.Send(messageQueueTransaction, auditEvent)).Throw(new Exception());
但接下来会:
queue.Stub(x => x.Send(messageQueueTransaction, auditEvent)).IgnoreArguments().Throw(new Exception());
因为瓦迪姆的异常抛出方法是无参数,它的工作没有忽视参数。
我的解决方案是为以下几点:
_xyz.Stub(x => x.Function(null)).IgnoreArguments().Throw(new Exception("test string"));
注意.IgnoreArguments()
电话。
可能是我忘了添加{在测试顶部的ExpectedException行]。 – alice7 2010-01-06 19:40:35