我是单元测试领域的新手,请让我免费。这个问题的目标是测试一个类如下所述:使用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
的事件引发事件。 请建议。
是声明为'virtual'的事件吗? – nozzleman
来自https://github.com/moq/moq4/issues/61 - _“事件与其他事物没有什么不同,它们必须是虚拟的才能嘲笑。”_ – stuartd
我的事件并非虚拟的,为什么他们应该是虚拟的?它的用途是什么?我必须做一个虚拟的假事件吗?如果是这样,MOQ有什么意义! @nozzleman –