2014-04-22 4 views
1

Я видел много сообщений, объясняющих, как использовать NMock для ожидания исключения. Но это не то, что я хочу знать. В моем случае я тестирую счастливый путь. Но похоже, что NMock бросает исключения, пока метод, вызванный макетом, вызывается внутри try/catch. Поэтому предположим, у меня есть метод в классе я тестирование:с использованием NMock3 в C#, издевательство над версиями, даже если я не говорю, чтобы он кидал

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

В тесте на единицу для этого класса, у меня есть тест для этого Func в 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/поймать в коде и просто делать (строка 8 - 18):

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

Этот тест будет работать нормально.

У кого-нибудь есть идея, почему это происходит? и как я мог сделать эту работу? Большое спасибо!

+1

Пожалуйста, переформатировать код без номеров строк. –

+0

Спасибо за напоминание. Я переформатировал его. – user1469452

+0

Хорошо, все готово. Спасибо за вашу помощь. – user1469452

ответ

1

Вы на самом деле не используете свой издеваемый объект, вы создаете конкретный (реальный) объект some_type в своем конструкторе MyClass с оператором new.

Я хотел бы предложить изменить свой MyClass класс принять some_type объект в качестве параметра конструктора:

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

Тогда в вашем методе испытаний, передать высмеивал объект в CTOR:

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