2010-01-05 67 views
8

我正在使用犀牛嘲笑3.5并试图在我的期望中抛出异常来测试我的catch块中的某些功能。如何在新的犀牛嘲笑中抛出异常3.5

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

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

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

回答

12

我不知道为什么它不适合你。我创建了一个小样本,它对我来说工作得很好。看看这段代码:

首先我创建了我想测试的代码。

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); 
    } 

我希望这有助于。

+0

可能是我忘了添加{在测试顶部的ExpectedException行]。 – alice7 2010-01-06 19:40:35

2

您可能需要发布更多信息和更多源代码。我的第一个猜测是,你所琢磨的方法在消费者中从未受到过打击。

当你浏览代码时,_xyz.function(string)被使用的地方会被击中吗?

+0

是的,它被击中。但不知何故,它不返回异常。 – alice7 2010-01-05 20:09:27

8

看来,如果你想抛出异常的方法有参数,那么你需要在.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()); 

因为瓦迪姆的异常抛出方法是无参数,它的工作没有忽视参数。

1

我的解决方案是为以下几点:

_xyz.Stub(x => x.Function(null)).IgnoreArguments().Throw(new Exception("test string")); 

注意.IgnoreArguments()电话。