私はユニットテストの世界で初めてですので、私を救ってください。問題の目的は、下記のようにクラスをテストすることです: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
からイベントをスローしたいだけです。 お勧めします。
は 'virtual'と宣言されたイベントですか? – nozzleman
https://github.com/moq/moq4/issues/61 - _ "イベントは他のものと変わらず、仮想化する必要があります。_ – stuartd
私のイベントは仮想ではありません。仮想ですか?それはどんな目的に役立ちますか?私はバーチャルな偽のイベントを作らなければならないのですか?もしそうなら、MOQのポイントは何ですか? @nozzleman –