Я новичок в мире тестирования модулей, поэтому, пожалуйста, пощадите меня. Целью данного вопроса является тестирование класса, как указано ниже:Тестирование модуля с использованием 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
с аргументом события. Пожалуйста, предложите.
- событие, объявленное как «виртуальное»? – nozzleman
От https://github.com/moq/moq4/issues/61 - _ «События ничем не отличаются от всех остальных. Они должны быть виртуальными, чтобы быть имитируемыми». _ – stuartd
Мои события не являются виртуальными, и почему они должны быть виртуальным? Какой цели это служит. Нужно ли делать фальшивое событие, которое является виртуальным. Если да, то в чем смысл MOQ! @nozzleman –