2017-01-18 54 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; 
    } 
} 

我想测试引擎中的公共职能。现在,我提出我的测试类: 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.

我不知道发生了什么事:如下所述

[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(); 
    } 
} 

MT测试失败给了一个错误。 我只想从事件名为ComponentController的事件名为EngineRunningStateChangedEvent的事件引发事件。 请建议。

+0

是声明为'virtual'的事件吗? – nozzleman

+0

来自https://github.com/moq/moq4/issues/61 - _“事件与其他事物没有什么不同,它们必须是虚拟的才能嘲笑。”_ – stuartd

+0

我的事件并非虚拟的,为什么他们应该是虚拟的?它的用途是什么?我必须做一个虚拟的假事件吗?如果是这样,MOQ有什么意义! @nozzleman –

回答

1

Moq只能模拟虚拟成员。它擅长模拟接口,因为没有实现,但如果你想模拟一个具体的类,你模拟的成员将需要虚拟。这可以让Moq用自己的方式来包装'真正'的实现。