Moq выбрасывает неверную настройку на не перезаписываемый элемент, когда класс находится в сервисном проекте - PullRequest
3 голосов
/ 24 июня 2011

Я пытаюсь провести модульное тестирование этого класса ServizioController:

public class ServizioController : IServizioController
{

    public virtual void PerformAction(Super.Core.Servizio servizio)
    {
    }

    public virtual bool Start()
    { throw new NotImplementedException(); }

    public virtual bool Stop()
    { throw new NotImplementedException(); }

    public virtual bool Continue()
    { throw new NotImplementedException(); }
}

Хорошо, если этот класс является частью теста или библиотечного проекта. Но когда он находится в сервисном проекте, Moq выдает мне эту ошибку:

Invalid setup on a non-overridable member: x => x.Start()

Мой тест выглядит так:

[TestMethod]
        public void ServizioController_PerformAction_Start()
        {
            //Arrange
            bool _start, _stop, _continue;
            _start = _stop = _continue = false;


            Super.Core.Servizio s = new Super.Core.Servizio()
            {
                Action = ServizioAction.START.ToString()
            };

            var mock = new Mock<ServizioController>() { CallBase = true };;
            mock.Setup(x => x.Start())
               .Callback(() => _start = true);
            mock.Setup(x => x.Stop())
               .Callback(() => _stop = true);
            mock.Setup(x => x.Continue())
               .Callback(() => _continue = true);

            //Act
            mock.Object.PerformAction(s);

            //Assert
            Assert.IsTrue(_start);
            Assert.IsFalse(_stop);
            Assert.IsFalse(_continue);
        }

Я готов продолжить, так что этот класс собирается присоединиться к библиотечному классу, но если бы кто-то мог объяснить мне это поведение, я был бы более чем счастлив ...

спасибо,

1 Ответ

0 голосов
/ 26 июня 2011

Ваши Setup методы должны иметь Returns, так как все эти методы, которые вы насмехаетесь, возвращают bool.

mock.Setup(x => x.Start()).Returns(true);

На заметку о том, что вам не нужно использовать Callback вэтот экземпляр как Verify сделает всю работу за вас

public void ServizioController_PerformAction_Start()
    {
        //Arrange
        Super.Core.Servizio s = new Super.Core.Servizio()
        {
            Action = ServizioAction.START.ToString()
        };

        var mock = new Mock<ServizioController>() { CallBase = true };
        mock.Setup(x => x.Start()).Returns(true);
        mock.Setup(x => x.Stop()).Returns(true);
        mock.Setup(x => x.Continue()).Returns(true);

        //Act
        mock.Object.PerformAction(s);

        //Assert
        mock.Verify(x => x.Start());
        mock.Verify(x => x.Stop());
        mock.Verify(x => x.Continue());
    }
...