我正在使用犀牛嘲笑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