0

我是 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()”。我注意到的另一件事是测试在倒数第二行终止,并且最后一行永远不会执行。我做的一切正确吗?

4

1 回答 1

2

请在下面找到工作片段。不同之处在于“CalculateAverage”被声明为虚拟。原因是 Moq 在“模拟”类上创建运行时包装器并覆盖其行为。但是如果方法不是虚拟的,那么它就是不可能的。

    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());
        }
    }
于 2010-04-25T14:04:30.390 回答