2017-01-18 11 views
-3

Я новичок в мире тестирования модулей, поэтому, пожалуйста, пощадите меня. Целью данного вопроса является тестирование класса, как указано ниже:Тестирование модуля с использованием Moq не работает

public class Engine 
{  
    #region Members 
    private EnumDefinition.EngineRunningState runningState; 
    private ComponentController componentController; 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 
    #endregion 

    #region Constructor 
    public Engine(ComponentController componentController) 
    { 
     this.componentController = componentController; 

    } 
    #endregion 

    #region Properties 
    public EnumDefinition.EngineRunningState RunningState 
    { 
     get 
     { 
      return runningState; 
     } 
     private set 
     { 
      if (value != runningState) 
      { 
       componentController.EngineRunningStateChangedEvent += OnEngineRunningStateChange;    
      } 
     } 
    } 
    #endregion 

    /// <summary> 
    /// Start the Engine Request 
    /// </summary> 
    public void StartEngineRequest() 
    { 
     // Check Engine Status 
     if (runningState == EnumDefinition.EngineRunningState.Off) 
     { 
      componentController.SetEngineRequestToActive(); 
     } 
     else if (runningState == EnumDefinition.EngineRunningState.Error) 
     { 
      logger.Trace("Engine Start Request Sent on a ENGINE ERROR!!!!!!"); 
     } 
     else 
     { 
      logger.Trace("Engine Start Request, Engine is still ON"); 
     } 

    } 
    private void OnEngineRunningStateChange(object sender, EngineRunningStateArgs e) 
    { 
      runningState = e.runningStateofEngine; 
    } 
} 

Я хочу проверить публичные функции в Engine. Теперь я представляю свой класс Test:

[TestFixture] 
public class EngineTest 
{  
    [Test] 
    public void StartEngineRequestTest() 
    { 
     Mock<ComponentController> mockComponentController = new Mock<ComponentController>(); 
     Mock<EngineRunningStateArgs> mockEngineRunningStateArgs = 
      new Mock<EngineRunningStateArgs>(EnumDefinition.EngineRunningState.On); 
     var engineTest = new Engine(mockComponentController.Object); 
     mockComponentController.Raise(mock => mock.EngineRunningStateChangedEvent += null, mockEngineRunningStateArgs.Object);    
     engineTest.StartEngineRequest(); 
    } 
} 

тест мт терпит неудачу дает ошибку, как указано ниже: Result StackTrace: at Moq.Extensions.GetEvent[TMock](Action 1 eventExpression, TMock mock) at Moq.Mock 1.Raise(Action 1 eventExpression, EventArgs args) at AutoTugTest.EngineTest.StartEngineRequestTest() in C:\GatewayController\01 Working Copy\GatewayComputer\AutoTugTest\EngineTest.cs:line 23 Result Message: System.ArgumentException : Expression is not an event attach or detach, or the event is declared in a class but not marked virtual.

Я понятия не имею, что происходит. Я просто хочу передать событие от ComponentController с именем события EngineRunningStateChangedEvent с аргументом события. Пожалуйста, предложите.

+0

- событие, объявленное как «виртуальное»? – nozzleman

+0

От https://github.com/moq/moq4/issues/61 - _ «События ничем не отличаются от всех остальных. Они должны быть виртуальными, чтобы быть имитируемыми». _ – stuartd

+0

Мои события не являются виртуальными, и почему они должны быть виртуальным? Какой цели это служит. Нужно ли делать фальшивое событие, которое является виртуальным. Если да, то в чем смысл MOQ! @nozzleman –

ответ

1

Moq может только издеваться над виртуальными участниками. Это хорошо для насмешливых интерфейсов, потому что нет реализаций, но если вы хотите издеваться над конкретным классом, члены, которых вы издеваетесь, должны быть виртуальными. Это позволяет Moq обернуть «реальную» реализацию своей собственной.