2010-01-05 72 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()電話。