Проверьте MVC с помощью moq - PullRequest
0 голосов
/ 25 апреля 2010

Я новичок в moq, и я пытался протестировать поведение контроллера (MVC): когда представление вызывает определенное событие, контроллер вызывает определенную функцию в модели, вот классы -

public class Model
{
    public void CalculateAverage()
    {
        ...
    }

    ...
}

public class View
{
    public event EventHandler CalculateAverage;

    private void RaiseCalculateAverage()
    {
        if (CalculateAverage != null)
        {
            CalculateAverage(this, EventArgs.Empty);
        }
    }

    ...
}

public class Controller
{
    private Model model;
    private View view;

    public Controller(Model model, View view)
    {
        this.model = model
        this.view = view;
        view.CalculaeAverage += view_CalculateAverage;
    }

    priavate void view_CalculateAverage(object sender, EventArgs args)
    {
        model.CalculateAverage();
    }
}

и тест -

[Test]
public void ModelCalculateAverageCalled()
{
    Mock<Model> modelMock = new Mock<Model>();
    Mock<View> viewMock = new Mock<View>();
    Controller controller = new Controller(modelMock.Object, viewMock.Object);
    viewMock.Raise(x => x.CalculateAverage += null, new EventArgs.Empty);
    modelMock.Verify(x => x.CalculateAverage());
    //never comes here, test fails in above line and exits
    Assert.True(true);
}

Проблема заключается в том, что во второй последней строке теста произошел сбой с «Вызов не был выполнен на макете: x => x.CalculateAverage ()». Еще одна вещь, которую я заметил, заключается в том, что тест завершается на этой второй последней строке, и последняя строка никогда не выполняется. Я все делаю правильно?

1 Ответ

2 голосов
/ 25 апреля 2010

Пожалуйста, найдите ниже рабочий фрагмент. Разница в том, что «CalculateAverage» объявлено как виртуальное. Причина в том, что Moq создает оболочку во время выполнения над классами «Mock» и переопределяет его поведение. Но если метод не является виртуальным, то это просто невозможно.

    public class Model
    {
        public virtual void CalculateAverage()
        {
        }
    }

    public class View
    {
        public virtual event EventHandler CalculateAverage;
    }

    public class Controller
    {
        private Model model;
        private View view;

        public Controller(Model model, View view)
        {
            this.model = model;
            this.view = view;
            view.CalculateAverage += view_CalculateAverage;
        }

        private void view_CalculateAverage(object sender, EventArgs args)
        {
            model.CalculateAverage();
        }
    }

    [TestFixture]
    public class MvcTest
    {
        [Test]
        public void ModelCalculateAverageCalled()
        {
            var modelMock = new Mock<Model>();
            var viewMock = new Mock<View>();

            var controller = new Controller(modelMock.Object, viewMock.Object);

            viewMock.Raise(x => x.CalculateAverage += null, EventArgs.Empty);
            modelMock.Verify(x => x.CalculateAverage());
        }
    }
...