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のパブリック関数をテストしたいと思います。今、私は私のテストクラスを提示:

[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テストは、下記のようにエラーを与える失敗: 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.

私は何が起こっているのか見当がつかない。 私は、イベント引数を持つEngineRunningStateChangedEventというイベント名を持つComponentControllerからイベントをスローしたいだけです。 お勧めします。

+0

は 'virtual'と宣言されたイベントですか? – nozzleman

+0

https://github.com/moq/moq4/issues/61 - _ "イベントは他のものと変わらず、仮想化する必要があります。_ – stuartd

+0

私のイベントは仮想ではありません。仮想ですか?それはどんな目的に役立ちますか?私はバーチャルな偽のイベントを作らなければならないのですか?もしそうなら、MOQのポイントは何ですか? @nozzleman –

答えて

1

Moqは仮想メンバーのみをモックできます。インプリメンテーションがないのでインターフェイスを嘲笑するのは得意ですが、具体的なクラスをモックする場合は、モックするメンバーを仮想にする必要があります。これにより、Moqは独自の「実際の」実装を包み込むことができます。

関連する問題