我正在使用rhino mocks 3.5并试图抛出异常,以期在我的catch块中测试一些功能。
但由于某种原因,它并没有抛出异常。
_xyz.stub(x => x.function(string)).throw(new exception("test string"));
所以,我正在调用函数来抛出异常,但它没有抛出异常。
答案 0 :(得分:13)
我不确定为什么它不适合你。我创建了一个小样本,它对我来说很好。看看这段代码:
首先,我创建了我想要测试的代码。
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);
}
我希望这会有所帮助。
答案 1 :(得分:9)
似乎如果您要抛出异常的方法有参数,那么您需要在.IgnoreArguments()
之前添加.Throw(new Exception())
。
例如,我发现以下内容不会抛出异常:
queue.Stub(x => x.Send(messageQueueTransaction, auditEvent)).Throw(new Exception());
但以下是:
queue.Stub(x => x.Send(messageQueueTransaction, auditEvent)).IgnoreArguments().Throw(new Exception());
因为Vadim的异常抛出方法是无参数的,所以它不会忽略参数。
答案 2 :(得分:2)
您可能需要发布更多信息和更多源代码。我的第一个猜测是,你正在使用的方法永远不会受到消费者的打击。
当您单步执行代码时,使用_xyz.function(字符串)的位置是否会被命中?
答案 3 :(得分:1)
我的解决方案如下:
_xyz.Stub(x => x.Function(null)).IgnoreArguments().Throw(new Exception("test string"));
请注意.IgnoreArguments()
来电。