2014-04-22 22 views
1

我已經看到很多文章解釋如何使用NMock來期望異常。但那不是我想知道的。就我而言,我正在測試快樂之路。但是看起來像NMock拋出異常,只要在模擬中調用的方法在try/catch中調用。 因此,假設我在類中的方法我測試:在c#中使用NMock3,即使當我不告訴它拋出時,模擬仍會拋出預期

class MyClass 
{ 
    public MyClass(some_type obj) 
    { 
     m_member = obj; 
    } 

    public void Func() 
    { 
     try 
     { 
      m_member.some_function() 
     } 
     catch (System.Exception e) 
     { 
      // do something 
     } 
    } 

    private some_type m_member; 
} 

在這個類的單元測試,我對這個函數功能在MyClass的一個測試,測試的快樂路徑:

[Test] 
public void TestFunc() 
{ 
    MockFactory mock_factory = new MockFactory(); 
    Mock<some_type> mock = mock_facoty.CreateMock<some_type>(); 
    MyClass uut = new MyClass(); 

    mock.Expects.One.MethodWith(_ => _.some_function()); 
    uut.Func(); 

    mock_facoty.VerifyAllExpectationsHaveBeenMet(); 
    mock_facoty.ClearExpectations(); 
} 

這個單元測試保持失敗。如果我刪除的try/catch中的代碼,只是做(行8 - 18):

public void Func() 
    { 
     //try 
     //{ 
      m_member.some_function() 
     //} 
     //catch (System.Exception e) 
     //{ 
     // // do something 
     //} 
    } 

這個測試將正常工作。

有沒有人有一個想法,爲什麼會發生這種情況?我怎麼能做這個工作? 非常感謝!

+1

請重新格式化您的代碼,而行數。 –

+0

感謝提醒。我已經重新格式化了它。 – user1469452

+0

好了,完成了。謝謝你的幫助。 – user1469452

回答

1

您實際上並沒有使用您的模擬對象,而是使用new語句在您的MyClass構造函數中創建了具體(實際)some_type對象。

我建議改變你的MyClass類接受some_type對象作爲構造函數的參數:

public MyClass(some_type thetype) 
{ 
    m_member = thetype; 
} 

然後,在您的測試方法,通過嘲笑對象到構造函數:

MockFactory mock_factory = new MockFactory(); 
Mock<some_type> mock = mock_factory.CreateMock<some_type>(); 
MyClass uut = new MyClass(mock.MockObject); 

這將意味着您的MyClass實例實際上會使用模擬對象,然後您可以對其進行驗證...

如果你不能改變你的構造函數有一個必需的參數的時候,你可以使用一個窮人的依賴注入(不推薦,但可能是必要的):

public MyClass() : this(new some_type()) {} 

public MyClass(some_type thetype) 
{ 
    m_member = thetype; 
} 
+0

你是對的構造函數。我實際上正在傳入some_type的對象來初始化成員。對不起,我沒有在我的帖子中得到這個部分。我已糾正它。但是,儘管我這樣做,上述問題仍然存在。任何想法爲什麼..? – user1469452

相關問題