Moq的MVP - 加载模拟视图

时间:2011-02-11 04:03:51

标签: tdd moq mvp

我已经阅读了很多关于嘲弄/抄袭/伪装的内容 - 但仍然遇到了我的心理障碍。

我正在努力使MVP(模型视图演示者)适应我为自己的Fatty McFatter-self建立的“有趣”减肥跟踪系统。我正在尝试TDD& “通过这本书”,但是打了很多精神障碍并且失速了。

我正在构建我的演示者并嘲笑我的服务&查看此刻。这是我的测试:再次注意:服务和视图都是用Moq模拟的

[Test]
    public void GetLog_WithExistingDate_ViewSetWithExistingLog()
    {
        WeightLogModel model = new WeightLogModel
                                   {
                                       EntryDate = DateTime.Now,
                                       Waist = 42,
                                       Weight = 242
                                   };

        service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);

        presenter.Display(DateTime.Now);

        IWeightLogView myView = view.Object;
        Assert.AreEqual(model.Weight, myView.Weight);

    }

在我的Presenter中 - 这是我的显示方法:

public void Display(DateTime date)
    {
        var weightLog = service.GetLog(date);
        if(weightLog == null) return;

        View.EntryDate = weightLog.EntryDate;
        View.Waist = weightLog.Waist;
        View.Weight = weightLog.Weight;
    }

现在 - 如果我调用Display正在调用 - 我看到weightLog填充了我在mock中设置的正确信息。但是,因为它假设设置View.EntryDate,View.Waist等 - 视图值永远不会改变。它们保持为零或0001/1/1

有没有办法让它发挥作用?或者这只是一个糟糕的测试,我在困惑中挣扎?

2 个答案:

答案 0 :(得分:2)

感谢Phil让我开始行动。虽然我不想明确设置我要返回的内容 - 但我希望模拟视图的行为与我的观点相似。您可以通过调用SetupProperty来使模拟的setter正常运行 - &gt; view.SetupProperty(x =&gt; x.Weight)//在我的情况下......这是现在通过的测试断言权重已设置

[Test]
    public void GetLog_WithExistingDate_ViewSetWithExistingLog()
    {
        WeightLogModel model = new WeightLogModel
                                   {
                                       EntryDate = DateTime.Now,
                                       Waist = 42,
                                       Weight = 242
                                   };

        service.Setup(x => x.GetLog(It.IsAny<DateTime>())).Returns(model);
        // I ADDED THIS ONE LINE
        view.SetupProperty(x => x.Weight);

        presenter.Display(DateTime.Now);

        IWeightLogView myView = view.Object;
        Assert.AreEqual(model.Weight, myView.Weight);

    }

答案 1 :(得分:1)

您没有在此处显示所有设置代码,也没有显示类之间的依赖关系。

但是,如果您确实在嘲笑名为“myView”的视图,它将返回您为模型设置返回的内容,或者如果您没有指定要返回的任何内容,则返回每种类型的默认值(听起来像发生了什么事。)

来自你的评论:

  

我正在尝试设置   service.GetLog(date)返回   WeightLogModel我在测试中。我的   思考是这样做 - 会做   那个WeightLogModel在我的   演示

到目前为止,它看起来似乎与原始问题有关。

  

分配给我的模拟视图 - 在哪里   View.EntryDate = weightLog.EntryDate   ....在这种情况下,weightLog是什么   在测试中设置....我希望我很清楚   至于我的头在哪里......我不是   说我是对的 - 这就是我的意思   但是想的是。

你错在哪里就是你说“分配给我的模拟视图”。从您的代码中不清楚View属性是否实际上是您的模拟视图(因为您的代码不完整)。

虽然在这种情况下,实际上并不重要。如果View属性实际上是一个mock,它只返回你告诉它返回的内容 - 它的属性不会像“普通”属性那样。

因此,如果没有明确的设置,以下内容将失败:

mockView.MyProperty = "hello";
Assert.AreEqual("hello", mock.MyProperty);