如何在新的犀牛嘲笑3.5中抛出异常

时间:2010-01-05 17:24:24

标签: c# unit-testing testing rhino-mocks

我正在使用rhino mocks 3.5并试图抛出异常,以期在我的catch块中测试一些功能。

但由于某种原因,它并没有抛出异常。

_xyz.stub(x => x.function(string)).throw(new exception("test string"));

所以,我正在调用函数来抛出异常,但它没有抛出异常。

4 个答案:

答案 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()来电。